我有一个程序,可以根据CSV文件批量创建目录。它遍历循环,但是在路径中命中“无效字符”。我需要验证(或if语句),以首先验证folderName,如果它无效-将其报告到日志文件中,然后继续进行下一个文件夹的创建
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();
我不确定从哪里开始。我觉得我必须添加一个“ if else”,但是我不确定该放什么。预先感谢。
答案 0 :(得分:3)
您需要在代码中进行的主要更改是停止将创建目标文件夹的变量连接在一起,并开始使用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
这样的文件产生任何问题,而此字符串包含的字符不能用于文件名或单个文件夹的名称。