С# выдает ошибку исключения, как только один или несколько файлов содержат недопустимые символы в папке

Я пытаюсь создать приложение на С#, в котором будут перечислены все файлы с некоторой информацией плюс будут перечислены все файлы или папки, содержащие недопустимые символы в имени или имеющие слишком длинный путь. с этим кодом

private void preCheckUploadToolStripMenuItem_Click(object sender, EventArgs e)
{
    FolderBrowserDialog selFolder = new FolderBrowserDialog();
    selFolder.Description = "Select a folder";
    var selFolderResponse = selFolder.ShowDialog();
    if (selFolderResponse != DialogResult.OK)
    {
        return;
    }

    logFile = selFolderName;
    try
    {
        createList(selFolder.SelectedPath);
    }
    catch (System.Exception ex)
    {
        WriteLog(logFile , "error;" + ex.Message );
    }
}

private void createList(string sDir)
{
    try
    {
        var filesInDir = Directory.GetFiles(sDir);
        foreach (string f in filesInDir)
        {
            WriteLog(logFile, "ok;" + f);
        }
    }
    catch (ArgumentException aexc)
    {
        WriteLog(logFile, "error;" + aexc.Message + sDir);              
    }
    catch (PathTooLongException pexc)
    {
        WriteLog(logFile", "error;" + pexc.Message + sDir);    
    }
    finally
    {
        foreach (string d in Directory.EnumerateDirectories(sDir))
            try
            {
                Application.DoEvents();
                createList(d);
            }
            catch (System.Exception excpt)
            {
                WriteLog(logFile, "error;" + excpt.Message + ";the whole folder will be skipped;" + sDir);
            }
    }
}

в Directory.GetFiles(sDir) я получаю ошибку ArgumentException с недопустимыми символами в пути и пропускаю всю папку. Я не могу перечислить файлы, содержащие недопустимые символы. я тоже пробовал

try
{
    foreach (string f in Directory.EnumerateFiles(sDir))
    {
        WriteLog(logFile, "ok;" + f);
    }
    catch( exception)
    {
    }

Здесь я получаю список только до действительных файлов, но как только он сталкивается с ошибкой, он пропускает остальную часть папки, и я также не могу получить имя файла, содержащее недопустимые символы.


person traveller    schedule 29.05.2018    source источник
comment
С каким значением sDir вы вызываете Directory.GetFiles(sDir)? Я бы предположил, что в нем есть недопустимый символ.   -  person PepitoSh    schedule 29.05.2018
comment
Вы не закрываете свои блоки try... Я не уверен, что этот код действительно может скомпилироваться. Кроме того, возможно, если вы try/catch внутри цикла, он не будет пропускать остальную часть папки всякий раз, когда в файле есть недопустимый символ.   -  person Rafalon    schedule 29.05.2018
comment
После повторного прочтения вашего вопроса кажется, что, как сказал PepitoSh, это не файлы, содержащие недопустимые символы, а sDir, которые вы передаете Directory.GetFiles(sDir)   -  person Rafalon    schedule 29.05.2018
comment
Первоначально sDir — это FolderBrowserDialog selFolder = new FolderBrowserDialog(); sDir = selFolder.SelectedPath, а затем с помощью Directory.getdirectory я читаю подкаталоги   -  person traveller    schedule 29.05.2018
comment
Пожалуйста, отредактируйте свой пост, чтобы включить это. Также, возможно, установите точку останова и сообщите нам, какое значение sDir в момент вызова Directory.GetFiles   -  person Rafalon    schedule 29.05.2018


Ответы (1)


вы можете использовать приведенный ниже код для проверки недопустимых символов в пути

 var invalidChars = Path.GetInvalidFileNameChars();
        bool bInvalid = invalidChars .Any(s1 => sDir.IndexOf(s1 )!=-1);
person GowriPranithBayyana    schedule 29.05.2018