Недопустимый символ в пути при создании папок - PullRequest
0 голосов
/ 13 июня 2019

У меня есть программа, которая массово создает каталоги на основе файла CSV. Он проходит через цикл, но затем попадает в «недопустимые символы в пути». Мне нужна проверка (или оператор if), чтобы сначала проверить имя_папки и, если оно неверно, - сообщить об этом в файле журнала, а затем просто перейти к следующему созданию папки. .

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();

Я не уверен, с чего начать. Я чувствую, что должен добавить «если еще», но я не уверен, что поставить. Заранее спасибо.

1 Ответ

3 голосов
/ 13 июня 2019

Основное изменение, которое вам нужно сделать в своем коде, - перестать объединять переменные, которые создают папку назначения, и начать использовать метод 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, в то время как эта строка содержит символы, которые нельзя использовать для имени файла или для имени отдельной папки.

...