【问题标题】:Illegal Character in Path when creating folders创建文件夹时路径中的非法字符
【发布时间】:2019-06-13 06:04:54
【问题描述】:

我有一个基于 CSV 文件批量创建目录的程序。它通过循环运行,但随后遇到“路径中的无效字符” .

StreamWriter sw = new StreamWriter(targetdir + "log.txt");

try
{
    string[] items = File.ReadAllLines(csv);

    foreach (string item in items)
    {
        Directory.CreateDirectory(targetdir + item);
        sw.WriteLine(item + " OK!");                    
    }                

    MessageBox.Show("Done");
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}

sw.Close();

我不知道从哪里开始。我觉得我必须添加一个“如果其他”,但我不知道该放什么。提前致谢。

【问题讨论】:

  • Path.GetInvalidPathChars() 可能是一个很好的起点:)
  • 你的朋友是 Path 类
  • 使用调试器查看targetdir + item 是否是有效路径——尤其是因为它来自其他地方!另外,不要使用字符串连接,而是使用Path.Combine 创建文件路径名
  • targetdir + item确切值是多少? (targetdir + item).Length?
  • and if it's invalid -reports it in a log file 这不是一个很好的 解决方案,但是基于您当前结构的简单解决方案是将日志记录添加到您的catch 中。另外,请阅读Path.Combine

标签: c# directory character


【解决方案1】:

您需要在代码中进行的主要更改是停止将创建目标文件夹的变量连接在一起并开始使用Path.Combine 方法。 在您的特定情况下,您可以使用 GetInvalidFileNameChars 列出不允许作为路径或文件名一部分的字符,然后检查当前项目是否包含这些字符中的任何一个。

但还有其他重要的改变要做。
首先,StreamWriter 是一个一次性对象,因此您应该始终在 using statement 中创建它,以便在您完成它或即使发生异常异常时正确清理其内部资源。
其次,最好使用File.ReadLines而不是使用ReadAllLines加载内存中的所有行

char[] invalidChars = Path.GetInvalidFileNameChars();
string logFile = Path.Combine(targetdir, "log.txt");
try
{
   using(StreamWriter sw = new StreamWriter(logFile))
   {
       foreach (string item in File.ReadLines(csv))
       {
           if(item.Any(x => invalidChars.Contains(x)))
                sw.WriteLine(item + " BAD");
           else
           {
                Directory.CreateDirectory(Path.Combine(targetdir,item));
                sw.WriteLine(item + " OK!");                    
           }
       }
    }                
    MessageBox.Show("Done");
}
catch(Exception ex)
{
    MessageBox.Show(ex.Message);
}

最后,我想强调一下,在这种情况下,使用 GetInvalidFileNameChars 而不是 GetInvalidPathChars 很重要,因为我们在这里检查文件夹的名称。此名称具有与文件相同的规则。
GetInvalidPathChars 会省略一些在 path 字符串中有效的字符,例如 \? 和 *。因此,例如 GetInvalidPathChars 对 C:\Windows\System32\*.dll 之类的内容没有任何问题,而此字符串包含不可用于文件名或单个文件夹名称的字符。

【讨论】:

  • 很高兴看到我不是唯一一个像这样使用 try catch 的人
  • 我试过了,但它仍然无法捕获包含无效字符的文件名
  • 你能举一些这些文件名的例子吗?考虑到这会检查 PATH 无效字符而不是文件
  • 对不起。当我说文件名时,我的意思是文件夹名称。以下是 CSV 中包含的名称示例: ?1? , A--* , B , D*a 我需要我的循环来忽略它。
  • 我明白了,应该改成 GetInvalidFilenameChars
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2013-11-24
相关资源
最近更新 更多