Directory.Delete с рекурсией случайно завершается неудачно, говоря: «Каталог не пустой» - PullRequest
0 голосов
/ 05 июля 2011

У меня есть промежуточный каталог, который я хочу очистить, если он использовался во время моего сценария. Код прост:

if (Directory.Exists(_stagingDir) &&
    Directory.EnumerateFileSystemEntries(_stagingDir).Any())
{
    Directory.Delete(_stagingDir, true);
}

Иногда происходит сбой при исключении ввода-вывода, что «Каталог не пустой». Разве это не имеет значения, если я рекурсивно удаляю все элементы внутри (что должен делать true в этой функции)? Если я вернусь к сценарию на несколько строк и запустлю его снова, он будет работать нормально.

Мое единственное предположение, что EnumerateFileSystemEntries блокирует файл, но я бы предположил, что получу совершенно другое исключение ("доступ запрещен" или "файл заблокирован" или что-то в этом роде).

1 Ответ

1 голос
/ 05 июля 2011

Зачем вообще звонить EnumerateFileSystemEntries?Если это является причиной вашей проблемы, то просто упростите до:

if (Directory.Exists(_stagingDir))
{
    Directory.Delete(_stagingDir, true);
}

Я подозреваю, что причиной этой ошибки является то, что перечисление, возвращаемое EnumerateFileSystemEntries, не удаляется к тому времени, когдаВы вызываете Delete(), что означает, что его дескрипторы для записей файловой системы все еще открыты.Вы могли бы переписать это с помощью using, чтобы обойти проблему, но на самом деле вам лучше вообще убрать лишний вызов, как показано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...