Здравствуйте, Kolesiki, Вы писали:
S>>А зачем ты в своей помоечке отмечаешь файлы readonly?
K>А кто тебе сказал, что я? Архив тоже может содержать такой атрибут. А может и не архив! К примеру, я получил граблями, удаляя мусор за Git'ом.
Если не ты, то значит, это был я. И правильно, нефига удалять файл, на который я поставил атрибут "только для чтения". Я зря его ставил чтоле.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Kolesiki, Вы писали:
K>>Разумеется, я накарябал хелпер для адекватного удаления каталога.
НС>Сбрасывать атрибуты лучше не при удалении, а при распаковке.
Лучше и там и там, а то в процессе существования файлов у них кто-то может аттрибуты поменять и тогда не удалится ничего.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Kolesiki, Вы писали:
K>>Разумеется, я накарябал хелпер для адекватного удаления каталога.
НС>Сбрасывать атрибуты лучше не при удалении, а при распаковке.
Архив — чисто пример "помойки, которую надо удалить". В конкретно моём случае не удалялся мусор после Git'а (его .git/* ) — можно подумать, ОДИН ридонли файл имеет какой-то смысл....
НС>>>Сбрасывать атрибуты лучше не при удалении, а при распаковке. Y>>Почему?
НС>Потому что может бомбануть еще в каком нибудь коде.
Если приложение создаёт файлы чисто для себя, то ему не стоит беспокоиться о чужом неведомом коде. Свой код надо оттестировать. А косяки чужих программ всё равно не предусмотришь. Качественный код от атрибутов файлов бомбить не должен. А некачественный может и на вполне легальной ситуации бомбануть.
Сбрасывать атрибуты при распаковке — это лишний код и затраты времени, которые могут быть вообще лишними. Например, чистка файлового мусора может выполняться внешней утилитой, которая надёжно обрабатывает все эти ситуации.
А при удалении я бы просто вызывал Directory.Delete(path, true) и ловил исключение. И только в случае исключения нужно делать перебор всех файлов со сбросом атрибута ReadOnly. И тогда снова Directory.Delete(path, true). А если и тут не смогла, то значит уже не смогла.
Здравствуйте, yenik, Вы писали:
Y>А при удалении я бы просто вызывал Directory.Delete(path, true) и ловил исключение. И только в случае исключения нужно делать перебор всех файлов со сбросом атрибута ReadOnly.
Проблема только в том что мы делаем допущение о readonly, исключение об этом ничего не говорит, тогда уже надо сначала убедится, что действительно ReadOnly стал причиной исключения.
Y>>А при удалении я бы просто вызывал Directory.Delete(path, true) и ловил исключение. И только в случае исключения нужно делать перебор всех файлов со сбросом атрибута ReadOnly.
vaa>Проблема только в том что мы делаем допущение о readonly, исключение об этом ничего не говорит, тогда уже надо сначала убедится, что действительно ReadOnly стал причиной исключения.
Да, делаем известное нам допущение. Можно для надёжности вообще все атрибуты сбросить, всё равно файлу не жить. А причин исключения может быть много, обрабатываем только то, что понимаем, предвидим и можем обработать.
vaa>PS vaa>Проверил в java удаляются ro-файлы.
А в .NET вот так. По-простому форсированное удаление не сделать.
Здравствуйте, vaa, Вы писали:
vaa>Проблема только в том что мы делаем допущение о readonly, исключение об этом ничего не говорит, тогда уже надо сначала убедится, что действительно ReadOnly стал причиной исключения.
Так надо не допущение делать, а документацию смотреть.
В исходном сообщении был DirectoryInfo и там такой метод Delete, который кидает UnauthorizedAccessException именно для read-only.
Если же мы используем Directory, то у него другой метод Delete и он уже кидает IOException в случает read-only.
Здравствуйте, yenik, Вы писали:
Y>А при удалении я бы просто вызывал Directory.Delete(path, true) и ловил исключение
Ну если совсем скучно — лови! Только зачем усложнять код? Больше задач нет, кроме как плясать вокруг M$ костылей? Снял "проблемные" атрибуты и удалил — вот и вся недолга.
Y>>А при удалении я бы просто вызывал Directory.Delete(path, true) и ловил исключение
K>Ну если совсем скучно — лови! Только зачем усложнять код? Больше задач нет, кроме как плясать вокруг M$ костылей? Снял "проблемные" атрибуты и удалил — вот и вся недолга.
Чтобы снять "проблемные" атрибуты, нужно перебрать файлы. С большой вероятностью файлов с такими атрибутами не найдётся, и эта работа окажется ненужной. Только углеродный след зря останется.
Поэтому перебор файлов со снятием атрибутов следует рассматривать как План Б, если по-простому удалить не получится.