Иногда метод System.IO Directory.Delete работает, но иногда (особенно в повторяющихся операциях) говорится: «Каталог не пустой» - PullRequest
0 голосов
/ 27 июня 2011

У меня есть кнопка в моем веб-приложении ASP.NET, и, когда она нажата, я просто удаляю содержимое папки и копирую и вставляю в нее новое свежее содержимое из другой папки. Обе папки являются дочерними для корневого каталога этого приложения, и каждая группа имеет полный доступ к этой папке ( только для целей тестирования ). Чтобы удалить файлы и папки из целевой папки, я использую метод Directory.Delete и возвращаю атрибуты каждого файла в нормальное состояние перед его удалением, что означает, что ни один файл не доступен только для чтения или не защищен при удалении. Это работает гладко. Но когда кто-то нажимает эту кнопку последовательно (менее чем за 15 секунд или около того), во второй раз он выдает исключение и показывает « Каталог не пустой ). Что мне делать? Я не знаю в чем проблема. Я думаю, что это должно быть что-то, связанное с IO операционной системы (в моем случае, Windows).

Ответы [ 3 ]

1 голос
/ 27 июня 2011

Использовать перегруженный метод, Directory.Delete(directoryToDelete, true);

Взгляните на этот метод .

Там написано

Удаляет указанный каталог и, если указано, любые подкаталоги и файлы в каталоге.

Метод Directory.Delete , который вы используете , требует, чтобы каталог был пустым.

Обновление

Этот вопрос задают здесь раньше.

Невозможно удалить каталог с Directory.Delete (путь, истина)

0 голосов
/ 23 мая 2013

Я думаю, что Directory.Delete (String, Boolean) возвращается до завершения удаления.

Я использовал приведенный ниже код для обновления каталогов, и Sleep (100) определенно срабатывает в некоторых случаях,но редко при первом вызове (что соответствует вашему описанию «специально (sic) в повторяющейся операции»).

        String destination = Path.Combine(targetFolder, Name);
        if (Directory.Exists(destination))
        {
            Directory.Delete(destination, true);

            Int32 i = 0;
            while(Directory.Exists(destination))
            {
                System.Threading.Thread.Sleep(100);
                if (i++ > 50) { throw new Exception("Failed to remove " + destination); }
            }
        }
        Directory.CreateDirectory(destination);
0 голосов
/ 10 августа 2011

Я нашел проблему. Я пытался удалить папку только для чтения . К сожалению, кажется, что .NET недостаточно умна, чтобы показывать соответствующее сообщение.

Однако всегда перед копированием, перемещением или удалением любого файла или папки установите для его атрибута значение Normal:

File.SetAttributes(filePath, FileAttributes.Normal);
...