Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 14.04.22 23:35
Оценка: +1 -1
Ну разве можно в мелкософте сделать что-то хорошо? Ты ж вызовешь функцию и ничего интересного — она просто сделает свою работу. А что если... наложить туда грабель?!
Все мы любим создавать небольшую помоечку на диске (к примеру, распаковать архив и автоматически обработать). Такую помоечку обычно создают в папке с каким-нть 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. Но если я удаляю каталог, какой смысл верещать, что его нет?? Ну мало ли, может это автогенерированное имя и я удаляю каталог "на авось"! Вот такие тупорылые проверки всего и вся и приводят к мегабайтам "говнокода", который не решает бизнес-задачи, а лавирует меж мелкомягких граблей.
Отредактировано 15.04.2022 8:20 Kolesiki . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.