Файлы и грабли - 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 . Предыдущая версия .
Re: Файлы и грабли - Microsoft way
От: Sharowarsheg  
Дата: 15.04.22 01:07
Оценка: +5 :)
Здравствуйте, Kolesiki, Вы писали:

K>Все мы любим создавать небольшую помоечку на диске (к примеру, распаковать архив и автоматически обработать). Такую помоечку обычно создают в папке с каким-нть GUID'ом и потом одним махом прибивают. Ха! Не тут-то было! Если ты думаешь, что вызвал "Directory.Delete(path, true)" и гора с плеч — хрен там, потому как при любом "readonly" файле функция весело падает с UnauthorizedAccessException!


А зачем ты в своей помоечке отмечаешь файлы readonly?
Re: Файлы и грабли - Microsoft way
От: vaa  
Дата: 15.04.22 02:01
Оценка: -1
Здравствуйте, Kolesiki, Вы писали:

K> File.SetAttributes(path, FileAttributes.Archive);


Чё грить, корявая реализация. Еще кажись на скрытых файлах падает.
нужон N[ew]IO или Apache FileUtils.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Файлы и грабли - Microsoft way
От: flаt  
Дата: 15.04.22 04:38
Оценка: +1
Здравствуйте, Sharowarsheg, Вы писали:


S>А зачем ты в своей помоечке отмечаешь файлы readonly?


Это не он — в архиве могут быть.
Re[3]: Файлы и грабли - Microsoft way
От: Sharowarsheg  
Дата: 15.04.22 05:41
Оценка: +4
Здравствуйте, flаt, Вы писали:


S>>А зачем ты в своей помоечке отмечаешь файлы readonly?


F>Это не он — в архиве могут быть.


Если кто-то другой поставил read-only, то всё работает, как надо. Кто-то другой хотел, чтобы ты подумал, прежде чем стирать этот ценный файл, раз он потрудился поставить read-only.
Re: Файлы и грабли - Microsoft way
От: karbofos42 Россия  
Дата: 15.04.22 06:26
Оценка: +1 -1
Здравствуйте, Kolesiki, Вы писали:

K>Все мы любим создавать небольшую помоечку на диске (к примеру, распаковать архив и автоматически обработать)


Нет. Всегда старался этого избегать.
Временные файлы создавать приходится только если предполагается работа с внешней программой или ещё какие-то объективные причины.
Ну, там отчёт генерируется, который потом в Word'е должен открыться и т.п.
Если же автоматическая обработка внутри моей же программы, то я лучше в MemoryStream засуну файл, чем сначала буду его на диск писать, потом считывать так же в память, потом удалять файл.
В разы дольше, сложнее, ещё и свет выключат у пользователя до удаления программой временных файлов и останутся они мёртвым грузом лежать.
Re[2]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 07:23
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>А зачем ты в своей помоечке отмечаешь файлы readonly?


А кто тебе сказал, что я? Архив тоже может содержать такой атрибут. А может и не архив! К примеру, я получил граблями, удаляя мусор за Git'ом.
Re[2]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 07:26
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Kolesiki, Вы писали:


K>> File.SetAttributes(path, FileAttributes.Archive);


vaa>Чё грить, корявая реализация. Еще кажись на скрытых файлах падает.

vaa>нужон N[ew]IO или Apache FileUtils.

Ты без "кажись", если упадёт — скажи, а так пердеть из кустов не надо. Понятно, что есть исключительные случаи, всё не предусмотришь. Но на r/o хотя бы не спотыкаемся! А главное — ОДНА функция удаляет весь каталог.
Re[4]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 07:31
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>Здравствуйте, flаt, Вы писали:



S>>>А зачем ты в своей помоечке отмечаешь файлы readonly?


F>>Это не он — в архиве могут быть.


S>Если кто-то другой поставил read-only, то всё работает, как надо. Кто-то другой хотел, чтобы ты подумал, прежде чем стирать этот ценный файл, раз он потрудился поставить read-only.


Дело в том, что если я удаляю ВЕСЬ каталог, не имеет значения, кто там среди мусора решил жить вечно. Для таких вопросов существует СИСТЕМА ПРАВ (админ, юзер и т.п.). А приказ системе "удали каталог и всю ерунду, что внутри" обязан работать без кривляний "у меня вот тут выживший". readonly — ну когда ты САМ лично ставил этот атрибут? Или разбирался с файлами "ну что же среди тысяч файлов этот один ридонли? Дай-ка я у автора спрошу!". Ведь не делал так никогда? Потому что это атавизм из DOS и он как-то вообще не прижился — ставят его чисто от нехрен делать. Например, Git.
Re[2]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 07:32
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, Kolesiki, Вы писали:


K>>Все мы любим создавать небольшую помоечку на диске (к примеру, распаковать архив и автоматически обработать)


K>Нет. Всегда старался этого избегать.

K>Временные файлы создавать приходится только если....


Узколобо мыслишь, родной! Тут ключевая мысль вообще не про архив — про удаление одним залпом.
Re[3]: Файлы и грабли - Microsoft way
От: vaa  
Дата: 15.04.22 07:40
Оценка:
Здравствуйте, Kolesiki, Вы писали:



K>Ты без "кажись", если упадёт — скажи, а так пердеть из кустов не надо.

Проверил что ли?
Вообще, конечно, странное решение удалять без предупреждения.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Файлы и грабли - Microsoft way
От: karbofos42 Россия  
Дата: 15.04.22 07:45
Оценка: +2 -1
Здравствуйте, Kolesiki, Вы писали:

K>Узколобо мыслишь, родной! Тут ключевая мысль вообще не про архив — про удаление одним залпом.


Это ты узко мыслишь и борешься с последствиями.
Может просто не нужно у пользователя на компе непонятными файлами сорить и не будет такой задачи/проблемы в принципе?
Re[4]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 08:13
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Вообще, конечно, странное решение удалять без предупреждения.


Ну да, всегда надо предупреждать! А на сервере, где производится удаление, сажается на цепь индус, который смотрит 24/7 на экран и жмёт "Yes, I'm sure!".
Re[4]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 08:15
Оценка: :)
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, Kolesiki, Вы писали:


K>>Узколобо мыслишь, родной! Тут ключевая мысль вообще не про архив — про удаление одним залпом.


K>Это ты узко мыслишь и борешься с последствиями.

K>Может просто не нужно у пользователя на компе непонятными файлами сорить и не будет такой задачи/проблемы в принципе?

Говорю же, узколобый тут ты. Который даже на секунду не допускает мысль, что файлы могут быть вообще не мои! Но удалять — надо. Такое в студенческую голову не приходило? Карбофос, ну вот серьёзно, что ты делаешь в ИТ с таким мышлением?? Ключевая мысль — удаление "проблемных" каталогов и желательно за один вызов. Поэтому там и написана ПРОСТЫНЯ КОДА, что M$ там насрала грабель.
Re[5]: Файлы и грабли - Microsoft way
От: vaa  
Дата: 15.04.22 08:16
Оценка:
Здравствуйте, Kolesiki, Вы писали:


K>Ну да, всегда надо предупреждать! А на сервере, где производится удаление, сажается на цепь индус, который смотрит 24/7 на экран и жмёт "Yes, I'm sure!".


7 раз отмерь, 1 отрежь (c)
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Файлы и грабли - Microsoft way
От: kov_serg Россия  
Дата: 15.04.22 08:22
Оценка:
Здравствуйте, Kolesiki, Вы писали:


K>Особо вы оцените "if (!Directory.Exists(path)) return;" Ведь как же так — пришли удалять каталог, а его нет — НЕПОРЯДОК, Алярм, свистать всех наверх — у нас "труп" исчез! Вот зачем такая проверка внутри Directory.Delete??? Если мне важно, чтобы каталог существовал, для этого есть отдельный вызов Exist. Но если я удаляю каталог, какой смысл верещать, что его нет?? Ну мало ли, может это автогенерированное имя и я удаляю каталог "на авось"! Вот такие тупорылые проверки всего и вся и приводят к мегабайтам "говнокода", который не решает бизнес-задачи, а лавирует меж мелкомягких граблей.


С этим будет работать?
http://www.flexhex.com/docs/articles/hard-links.phtml
Re[6]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 08:24
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, Kolesiki, Вы писали:



K>>Ну да, всегда надо предупреждать! А на сервере, где производится удаление, сажается на цепь индус, который смотрит 24/7 на экран и жмёт "Yes, I'm sure!".


vaa>7 раз отмерь, 1 отрежь (c)


Скажешь это начальнику, когда он тебе член оттянет и отрежет! (за то, что занимаешься ненужными подтверждениями там, где всё должно работать на автомате)

Помню, в приснопамятные времена была такая ошибка в BIOS:

"Keyboard is not found. Press F1 to continue..."
Re[2]: Файлы и грабли - Microsoft way
От: Kolesiki  
Дата: 15.04.22 08:27
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>С этим будет работать?

_>http://www.flexhex.com/docs/articles/hard-links.phtml

С симв.ссылками работает. С хардлинками тоже (проверено).
Отредактировано 15.04.2022 8:35 Kolesiki . Предыдущая версия .
Re: Файлы и грабли - Microsoft way
От: Ночной Смотрящий Россия  
Дата: 15.04.22 10:49
Оценка: +1
Здравствуйте, Kolesiki, Вы писали:

K>Разумеется, я накарябал хелпер для адекватного удаления каталога.


Сбрасывать атрибуты лучше не при удалении, а при распаковке.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[7]: Файлы и грабли - Microsoft way
От: vaa  
Дата: 15.04.22 14:45
Оценка: -1 :)
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, Kolesiki, Вы писали:



K>>>Ну да, всегда надо предупреждать! А на сервере, где производится удаление, сажается на цепь индус, который смотрит 24/7 на экран и жмёт "Yes, I'm sure!".


vaa>>7 раз отмерь, 1 отрежь (c)


K>Скажешь это начальнику, когда он тебе член оттянет и отрежет! (за то, что занимаешься ненужными подтверждениями там, где всё должно работать на автомате)


Эх, малыш! Все еще под начальником ходишь? Ну ничего, терпи!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.