Основное изменение, которое вам нужно сделать в своем коде, - перестать объединять переменные, которые создают папку назначения, и начать использовать метод Path.Combine .
В вашем конкретном случае вы можете использовать GetInvalidFileNameChars , чтобы получить список символов, которые не могут быть частью пути или имени файла, а затем проверить, содержит ли текущий элемент какой-либо из этих символов.
Но есть и другие важные изменения.
Во-первых, StreamWriter - это одноразовый объект, и поэтому вы всегда должны создавать его внутри оператора , используя оператор , для правильной очистки его внутренних ресурсов, когда вы покончили с ним, или даже если возникнет ненормальное исключение.
Во-вторых, лучше использовать 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
, в то время как эта строка содержит символы, которые нельзя использовать для имени файла или для имени отдельной папки.