Ну разве можно в мелкософте сделать что-то хорошо? Ты ж вызовешь функцию и ничего интересного — она просто сделает свою работу. А что если... наложить туда грабель?!
Все мы любим создавать небольшую помоечку на диске (к примеру, распаковать архив и автоматически обработать). Такую помоечку обычно создают в папке с каким-нть GUID'ом и потом одним махом прибивают. Ха! Не тут-то было! Если ты думаешь, что вызвал "Directory.Delete(path, true)" и гора с плеч — хрен там, потому как при любом "readonly" файле функция весело падает с UnauthorizedAccessException! Казалось бы, причём тут "неавторизованный"?? Под админом я имею полное право удалить любую фигню, но даже если вы запустите свою прогу с админскими правами, она точно так же упадёт. А ТО НЕ ДАЙ БОГ(!!!!!!!!!) ты, имбецильный бедолага (а в мелкософте вас всех такими считают), удалишь readonly файл! Он же так важен....
Короче, вместо действительно удобной функции "Удалить каталог и всю тряхомудию внутри", тебе дают всего лишь "удалятор каталога и подкаталогов, но ТОЛЬКО при условии, что они все пустые". Вот вам и грабельки, шоп погромиздить нескучно было! "Дебилы, б****!" (ц) Лавров
Я думал, что никому нахрен не нужный readonly атрибут достался нам со времён убогого DOSа, когда каждый дебил творил в меру своей фантазии. Но нет... мелкософт чтёт заплесневелые традиции и даже имея развитую систему прав NTFS, продолжает идиотничать с этими атавизмами.
Разумеется, я накарябал хелпер для адекватного удаления каталога. Выложу сюда, чтобы вы не тратили бесценное время бизнес задач на мелкомягких идиотов.
Если где там чо ошибаюсь — чур говном не кидаться, приучайтесь к цивилизованным манерам.
/// <summary>Proper deletion function, which doesn't moan 'folder does not exist'.</summary>
public static void DeleteDir(string path)
{
if (!Directory.Exists(path)) return;
DeleteSubfiles(path);
Directory.Delete(path, true);
}
/// <summary>Delete files in a given folder and all subfolders.</summary>
/// <remarks>It's preparation for Directory.Delete()</remarks>
static void DeleteSubfiles(string path)
{
var dir = new DirectoryInfo(path);
foreach (FileInfo fi in dir.EnumerateFiles())
DeleteFile(fi.FullName);
foreach (var di in dir.EnumerateDirectories())
DeleteSubfiles(di.FullName);
}
public static void DeleteFile(string path)
{
try {
File.Delete(path);
} catch(UnauthorizedAccessException) {
File.SetAttributes(path, FileAttributes.Archive);
File.Delete(path);// don't catch here Exception - it means smth serious
}
}
UPD
Особо вы оцените "if (!Directory.Exists(path)) return;"
Ведь как же так — пришли удалять каталог, а его нет — НЕПОРЯДОК, Алярм, свистать всех наверх — у нас "труп" исчез!
Вот зачем такая проверка внутри Directory.Delete???
Если мне важно, чтобы каталог существовал, для этого есть отдельный вызов Exist. Но если я удаляю каталог, какой смысл верещать, что его нет?? Ну мало ли, может это автогенерированное имя и я удаляю каталог "на авось"! Вот такие тупорылые проверки всего и вся и приводят к мегабайтам "говнокода", который не решает бизнес-задачи, а лавирует меж мелкомягких граблей.