2009-07-26 5 views
6

Есть ли способ удалить все файлы & подкаталогов указанной директории без итерации по ним?Каков наилучший способ для удаления каталога?

НЕРАСПРОСТРАНЕНИИ элегантное решение:

public static void EmptyDirectory(string path) 
{ 
    if (Directory.Exists(path)) 
    { 
     // Delete all files 
     foreach (var file in Directory.GetFiles(path)) 
     { 
      File.Delete(file); 
     } 

     // Delete all folders 
     foreach (var directory in Directory.GetDirectories(path)) 
     { 
      Directory.Delete(directory, true); 
     } 
    } 
} 
+0

http://social.msdn.microsoft.com/Forums/vstudio/en-US/2239b45a-3f19-4a2a-b5cd-050b3ee32b9d/how-can-i-check-folder-is-empty-or-not ? forum = csharpgeneral –

ответ

10

Как насчет System.IO.Directory.Delete? Он имеет вариант рекурсии, вы даже используете его. Просмотрев свой код, похоже, что вы пытаетесь сделать что-то немного другое - очистите каталог, не удалив его, не так ли? Ну, вы можете удалить его и заново создать его :)


В любом случае, вы (или какой-то метод, который вы используете) должны перебрать все файлы и подкаталоги. Тем не менее, вы можете перебрать обоих файлов и каталогов, в то же время, используя GetFileSystemInfos:

foreach(System.IO.FileSystemInfo fsi in 
    new System.IO.DirectoryInfo(path).GetFileSystemInfos()) 
{ 
    if (fsi is System.IO.DirectoryInfo) 
     ((System.IO.DirectoryInfo)fsi).Delete(true); 
    else 
     fsi.Delete(); 
} 
+0

Это приятное решение, но я не понимаю, насколько он более элегантный, чем оригинальный код. Я просто не понимаю, в чем проблема. –

+0

Это приведет к потере всех метаданных, таких как списки ACL и метки времени. Это может быть или не быть приемлемым для данного варианта использования – jpaugh

+0

@jpaugh Удаление и пересоздание каталогов сделали бы это, но это не то, что делает это решение. Никакие ACL или временные метки не будут потеряны, кроме удаленных файлов, которые, конечно же, потеряют всю информацию, связанную с этими файлами, я не могу себе представить, что ожидаю чего-нибудь еще, если файл будет удален. – BlueMonkMN

3

Почему это не элегантно? Он чистый, очень читаемый и выполняет эту работу.

2

Ну, вы всегда можете просто использовать Directory.Delete ....

http://msdn.microsoft.com/en-us/library/aa328748%28VS.71%29.aspx

Или если вы хотите получить фантазию, используйте WMI для удаления каталога.

+0

Если я правильно его интерпретирую, он не хочет удалять каталог, а только файлы и подкаталоги в нем. –

+1

Yeh, правда, но Directory.Delete по-прежнему является лучшим способом. Удаление каталога и повторное создание пустого места на его месте более «изящно» и, вероятно, быстрее, чем итерация. – TheSmurf

+0

Этот подход не сохранит никаких прав наследования, не унаследованные. – Craig