C# вылетает при попытке удалить несуществующую папку - PullRequest
0 голосов
/ 05 мая 2020

Итак, теперь я изо всех сил пытаюсь добавить в код оператор if ... он продолжает сбой приложения, если каталог не найден. Я хотел бы добавить, что если каталог не найден, он вернет сообщение об ошибке в консоль, которое будет Console.WriteLine("Directory not found.. Aborted.");

Код, который я сейчас использую:

Console.WriteLine("Removing....");

new System.IO.DirectoryInfo( Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData ) + "/Testing4121" ).Delete( true );

Console.Clear();

Ответы [ 3 ]

3 голосов
/ 05 мая 2020

Шаг 1: Ремонтопригодность

Я не фанат анонимных объектов, поэтому давайте сделаем следующее:

Console.WriteLine("Removing....");

String appDataPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
String targetPath  = appDataPath + "/Testing4121";

DirectoryInfo targetDir = new DirectoryInfo( targetPath );
targetDir.Delete( recursive: true );

Console.Clear();

Шаг 2: Использование правильных System.IO API:

Используйте Path.Combine для конкатенации компонентов пути, а не конкатенации строк:

Console.WriteLine("Removing....");

String appDataPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
DirectoryInfo targetDir = Path.Combine( appDataPath, "Testing4121" );

targetDir.Delete( recursive: true );

Console.Clear();

Шаг 3: Проверка существования:

Самое простое решение вашей проблемы - защитить .Delete с if( DirectoryInfo.Exists ):

Console.WriteLine("Removing....");

String appDataPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
DirectoryInfo targetDir = Path.Combine( appDataPath, "Testing4121" );

if( targetDir.Exists )
{
    targetDir.Delete( recursive: true );
}

Console.Clear();

Шаг 4: Обработка исключительных ситуаций:

... при этом другие ошибки могут возникать при удалении папки помимо каталога -does-not-exist, поэтому мы должны поймать их, но только те , которые должны быть пойманы (т.е. только определенные c Exception -подклассы catch, только Exception, если вы знаете, что вы делаете - или повторно бросаете его после выполнения регистрации ошибок).

Console.WriteLine("Removing....");

String appDataPath = Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData );
DirectoryInfo targetDir = Path.Combine( appDataPath, "Testing4121" );

if( targetDir.Exists )
{
    try
    {
        targetDir.Delete( recursive: true );
    }
    // See the "Exceptions" list in the documentation for `DirectoryInfo.Delete` to see what to catch: https://docs.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.delete?view=netcore-3.1
    catch( UnauthorizedAccessException uaEx )
    {
        Console.WriteLine( "Cannot delete directory: a read-only file exists in the directory." );
    }
    catch( DirectoryNotFoundException nxDirEx )
    {
        Console.WriteLine( "Directory was unexpectedly deleted by another program while I was trying to delete it." );
    }
    catch( IOException ioEx ) // while this includes DirectoryNotFoundException, that's caught above.
    {
        Console.WriteLine( "Unexpected IO error: " + ioEx.ToString() );
    }
    catch( SecurityException secEx ) // Don't confuse SecurityException with UnauthorizedAccessException.
    {
        Console.WriteLine( "You do not have permission to delete this directory or a subdirectory thereof." );
    }
    // DO NOT use `catch( Exception ex )` unless the exception is re-thrown using `throw;` to avoid swallowing exceptions that should be caught by a caller higher-up in the call-stack.
    // Only ever use `throw;`, NEVER USE `throw ex;` because that resets the stack-trace: https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2200?view=vs-2019
    catch( Exception ex )
    {
        Console.WriteLine( "An unexpected error occurred. Re-throwing." );
        throw;
    }
}
else
{
    Console.WriteLine( "The directory does not exist - no need to delete it." );
}

Console.Clear();
1 голос
/ 05 мая 2020

Вы можете просто поместить его в блок try catch. Затем он автоматически выводится на консоль при возникновении ошибки:

        try
        {
            Console.WriteLine("Removing....");
            new System.IO.DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "/Testing4121").Delete(true);
            Console.Clear();
        }
        catch(Exception e)
        {
            Console.WriteLine($"{ e }: Directory not found.. Aborted.");
        }
0 голосов
/ 05 мая 2020
if(Directory.Exists(path))
{
  // This path is a directory
}
else
{
  Console.WriteLine("{0} is not a valid file or directory.", path);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...