Как упомянуто выше, «принятое» решение не срабатывает в точках повторной обработки - но люди все еще отмечают его (???). Существует гораздо более короткое решение, которое правильно копирует функциональность:
public static void rmdir(string target, bool recursive)
{
string tfilename = Path.GetDirectoryName(target) +
(target.Contains(Path.DirectorySeparatorChar.ToString()) ? Path.DirectorySeparatorChar.ToString() : string.Empty) +
Path.GetRandomFileName();
Directory.Move(target, tfilename);
Directory.Delete(tfilename, recursive);
}
Я знаю, что не обрабатывает случаи разрешений, упомянутые позже, но для всех намерений и целей FAR BETTER обеспечивает ожидаемую функциональность оригинального / стокового Directory.Delete () намного меньше кода тоже .
Вы можете безопасно продолжить обработку, потому что старый каталог будет отсутствовать ... даже если он не исчезнет, потому что «файловая система все еще догоняет» (или любое другое оправдание, которое MS дал для предоставления сломанной функции ) .
В качестве преимущества, если вы знаете, что целевой каталог большой / глубокий и не хотите ждать (или беспокоиться об исключениях), последнюю строку можно заменить на:
ThreadPool.QueueUserWorkItem((o) => { Directory.Delete(tfilename, recursive); });
Вы все еще можете продолжать работу.