首页 > 解决方案 > 创建文件夹时路径中的非法字符

问题描述

我有一个基于 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();

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

标签: c#directorycharacter

解决方案


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

但还有其他重要的改变要做。
首先,StreamWriter 是一个一次性对象,因此您应该始终在using 语句中创建它,以便在您使用它或即使发生异常异常时正确清理其内部资源。
其次,最好使用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 省略了一些在路径字符串中有效的字符,例如\? 和 *。因此,例如 GetInvalidPathChars 没有任何问题,例如C:\Windows\System32\*.dll当此字符串包含不可用于文件名或单个文件夹名称的字符时。


推荐阅读