51

Мне нужно удалить одну папку, содержащую другие папки и файлы внутри. Я пробовал команды del и rmdir но иногда они заканчиваются ошибкой: [PATH]: The directory isn't empty.

Есть ли хорошая альтернатива?

8 ответов8

50

Пытаться:

rmdir /S your_directory

или же:

rmdir /S /Q your_directory 

пропустить подтверждающие сообщения.

15

Это часто случается со мной с моими автоматическими скриптами сборки.

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

Это означает, что файл все еще может быть там, когда команда rmdir пытается удалить папку, поэтому появляется сообщение об ошибке. Вскоре после этого указанное приложение закроет свой дескриптор, файл исчезнет, и когда вы осмотрите папку, чтобы увидеть, о каком файле говорит rmdir он будет пустым.

По крайней мере, это моя теория.

Обход, предложенный Гарри Джонстоном, выглядит хорошо. Только я бы вставил паузу между командами rmdir . Конечно, в Windows нет легко запускаемой команды "пауза" (исправление: в старых версиях Windows этого нет, в более новых версиях - см. Комментарии). Но если секундной детализации достаточно, можно использовать ping для создания паузы:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

Итак, всего:

rd /s /q foo
:: retry once
if exist foo (
    :: clear errorlevel
    cmd /c
    :: pause
    ping -n 2 127.0.0.1 >nul
    :: retry
    rd /s /q foo
)
:: retry yet again
if exist foo (
    cmd /c
    ping -n 2 127.0.0.1 >nul
    rd /s /q foo
)
:: give up
if exist foo {panic}
11

У вас могут быть некоторые файлы только для чтения, вы можете использовать опцию del /F, чтобы избавиться от них, используя

     del /S /F your_directory
     rmdir your_directory

Вы также можете иметь некоторые скрытые файлы, и если вы действительно уверены, что хотите удалить их, то вы можете сделать это, используя

     del /S /F /AH your_directory
     rmdir your_directory

Если это по-прежнему не удается, либо у вас нет разрешения на удаление некоторых файлов, либо некоторые файлы все еще используются.

4

Я считаю, что есть ошибка в Windows 7 (и, возможно, в других версиях), которая иногда вызывает этот симптом; или это может быть ошибка в стороннем программном обеспечении. (У вас случайно установлен Symantec Endpoint Protection?)

Во всяком случае, я сталкивался с этим довольно часто. В большинстве случаев проблему можно обойти, запустив rd /s /q два или три раза подряд.

Если это в командном файле, вы можете сделать что-то вроде этого:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
3

Используйте del для файлов внутри, затем rmdir чтобы удалить папку.

Чтобы также использовать метод rmdir для удаления всех файлов, используйте ключ /S перед именем каталога и /Q для подавления запроса на удаление. Это лучший способ сделать это, так как вы не пропустите ни одного файла. Будьте осторожны, используя ключ /Q, поскольку он не предупредит вас о системных или скрытых атрибутах файла.

2

Если вы используете узел, вы можете использовать зависимость rimraf следующим образом:

запустить установку: npm install rimraf -g

удалить папку: rimraf SourceFolder

Это помогло мне при получении ошибки:

имена исходных файлов больше, чем поддерживается файловой системой

0

Папка более старых версий Windows (DOS, Windows 95/98/ME), DELTREE является эквивалентом RM или RMDIR . Я использую DELTREE на своей рабочей станции Windows 7 в пакетных файлах, хотя отлично.

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
-1

Я думаю, что вы можете использовать это так:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .