【问题标题】:How to trim a file name to not exceed the maximum file path size如何修剪文件名以不超过最大文件路径大小
【发布时间】:2020-09-14 10:18:30
【问题描述】:

我正在制作一个图像下载器,它应该能够用标签命名下载的文件。但是,有时标签太多,我会因为文件名太长而出现异常。

文件路径为:我的.exe路径+./out/目录+标签+扩展名

我想要一段代码,如果它的完整路径超过最大长度,我可以修剪文件名字符串并保留扩展名。

我已经得到了一些代码,但它不能正常工作,而且我认为它不够干净。

string Truncate(string value, int maxChars)
{
    return value.Length <= maxChars ? value : value.Substring(0, maxChars) + "...";
}
private async void downloadImage(string url, string tags, string rating)
        {
            string fullpath = "./out/" + rating + tags + ExtFromURL(url);
            string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
            Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
            fullpath = r.Replace(fullpath, "");

            string shortPath = Path.GetFullPath("./out/" + rating + ExtFromURL(url));
            string extension = fullpath.Substring(fullpath.Length - 5);
            if (fullpath.Length > 259)
                fullpath = Truncate(fullpath, 259 - shortPath.Length - 4);
            try
            {
                using (WebClient wc = new WebClient())
                {
                    wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; " +
                                      "Windows NT 5.2; .NET CLR 1.0.3705;)");
                    await wc.DownloadFileTaskAsync(new System.Uri(url), fullpath + extension);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

【问题讨论】:

  • 吹毛求疵,但调用者函数不应该处理您添加的椭圆字符串的大小(“...”),因为这是调用者不知道的事情。如果你改变椭圆,你会通过所有调用将 -4 更改为 -8 吗? private string Truncate(string input, int lenght, string ellipse = "...") =&gt; (input.Length &lt; lenght ? input : input.Substring(0, lenght - ellipse.Length) + ellipse);

标签: c# string path


【解决方案1】:

文件路径为:我的.exe路径+./out/目录+标签+扩展名

没有明智的方法可以做到这一点。如果您不希望文件名过长,请不要一开始就向其中添加内容。但即便如此,它也可能会很长,因为有人选择了一条非常非常长的路径作为他们的输出目录。

通常此类目录位于用户配置文件中。虽然这使得拥有写入权限的位置非常可靠,但这也使得完全合格的路径变得非常长。我在制作这些文件夹的备份副本时遇到了一些冗长的问题!

这是一个普通的旧Exogenous excetpions。除了抓住它并告诉用户它之外,你无能为力。只要用户可以选择 out 文件夹 - 可能还有要添加的标签 - 这不是要解决的问题。

但请注意只捕获您可以实际处理的确切异常。在生产代码中应避免使用catch (Exception ex)

【讨论】:

  • 但是我可以使用一些while循环来缩短字符串吗?我知道这样做会减少标签,但我认为总比没有好。
  • @РусланИсаев 只允许用户选择要使用的标签。然后他可以缩短它并且仍然知道它的名字。大多数备份软件和 CD 数字化仪软件都使用这种模式 | “注意和试图变得聪明的代码一样愚蠢。”用循环自动缩短字符串?完全有可能。但它也试图变得聪明。
  • 就我而言,我认为自动缩短字符串会更好、更容易。你能给我一些代码吗?我不知道该怎么做
  • @РусланИсаев 您正在将标签附加到文件名,对吗?如果是这样,请在添加标签的情况下尝试一次。一次没有标签。如果这也失败了,用户的工作就是找到一个合适的文件夹来存储东西。理想情况下,用于选择文件夹和/或启动的 UI 应检查设置的文件夹是否可用于带有/不带标签的名称。
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2014-02-08
  • 2018-06-27
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多