Шаг 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();