Как удалить папку, имя которой оканчивается точкой («.»)?

89

У меня есть папки, созданные вредоносным ПО, чьи имена заканчиваются точкой, например C:\a.\или C:\b.\, и т. Д.

Я нашел решение, которое может удалить такую ​​папку с помощью команды, rd /q /s "C:\a.\"но если я вызову Win API RemoveDirectory, она вернется ERROR_FILE_NOT_FOUND.

И мне просто интересно, как написать функцию для удаления такого каталога, спасибо

Я тестирую свою собственную систему Windows XP SP3 вот так

создать папку, C:\>mkdir a..\\\и я не могу дважды щелкнуть для доступа к этой папке. и я могу удалить командой rd /q /s "C:\a.\"

какие системные API Windows rd /q /sвызывают эту команду?

jerry.liu
источник
Я не могу поверить, что это все еще происходит в Windows 10, самим обновлением Windows (он не смог удалить Windows.old после обновления).
Damn Vegetables

Ответы:

147

Вот решение этой проблемы :

rd /s "\\?\C:\Documents and Settings\User\Desktop\Annoying Folder."
Skilldrick
источник
1
Вопрос требует, чтобы функция API удалила папку, и заявляет, что ее можно удалить с помощью rd.
Jcl 04
4
Достаточно справедливо - возможно, поэтому он не отмечен как принятый ответ, но, тем не менее, он очень полезен для тех, кто сталкивается с той же проблемой, но где мы можем использовать rd.
david.barkhuizen
2
Ты только что спас мне нервы. Спасибо! : D
Бенни Нойгебауэр
8
Обратите внимание, что это работает только с CMD.exe, а НЕ с PowerShell
Lorne K,
2
также попробуйте запустить CMD.exeв режиме администратора, если он не работает в командной строке без повышенных
greg
63

Решение. При вызове RemoveDirectory убедитесь, что путь к пути указан строкой " \\?\".


Пояснение: Это все связано с точкой. Согласно MSDN, есть определенные случаи, когда вы не сможете удалить файл или папку на томе NTFS, особенно когда имя файла недопустимо в пространстве имен Win32 (вот почему вы не можете открыть файл с помощью обычные методы в проводнике Windows).

Вы не сможете удалить файл, если имя файла включает недопустимое имя (например, имя файла имеет конечный пробел или конечную точку или имя файла состоит только из пробела). Чтобы решить эту проблему, используйте инструмент, который использует соответствующий внутренний синтаксис для удаления файла. Вы можете использовать синтаксис «\\? \» С некоторыми инструментами для работы с этими файлами, например:
del "\\? \ c: \ path_to_file_that содержит завершающий пробел.txt"
Причина этой проблемы аналогична причине 4. Однако, если вы используете типичный синтаксис Win32 для открытия файла, в имени которого есть конечные пробелы или конечные точки, конечные пробелы или точки удаляются перед открытием фактического файла. Следовательно, если у вас есть два файла в одной папке с именами «AFile.txt» и «AFile.txt» (обратите внимание на пробел после имени файла), если вы попытаетесь открыть второй файл с помощью стандартных вызовов Win32, вы откроете вместо этого первый файл. Точно так же, если у вас есть файл, имя которого просто "" (символ пробела), и вы пытаетесь открыть его с помощью стандартных вызовов Win32, вместо этого вы открываете родительскую папку файла. В этой ситуации, если вы попытаетесь изменить параметры безопасности для этих файлов, вы либо не сможете это сделать, либо можете неожиданно изменить параметры для других файлов.

(Источник: http://support.microsoft.com/?kbid=320081 )

Коди Грей
источник
У меня отлично получилось удалить файл с завершением имени на ".". Большое спасибо !
AFract
1
rd "\\?\C:\Users\ahmed\Desktop\buggy."
Сработало
Это отлично работает с cmd, но есть ли эквивалент для PowerShell? rdв pwsh есть псевдоним, remove-itemкоторый не поддерживает `\\? \`.
Кагами Саша Rosylight
1
Конечно, есть. Я просто использовал PowerShell rd для удаления такого файла, и он работал нормально. Еще раз проверьте свой синтаксис.
SilverbackNet
Вау. Наткнулся на эту проблему, пытаясь выполнить некоторую обработку естественного языка в наборе данных (каждый файл в наборе данных назван {IncrementalNumber}.), и я был очень смущен тем, почему мои сценарии обработки данных не работают. Теперь это имеет смысл, но похоже, что поведение настолько неожиданное, что может иметь разветвления безопасности из-за того, что приложения неправильно обрабатывают имена файлов, заканчивающиеся пробелом или точкой.
Spencer D
46

Я разместил это на SU и решил разместить это и здесь. Это самый простой, самый быстрый и легкий способ добиться этого. Теперь я смеюсь над тем, насколько это просто.

  1. Установить WinRAR
  2. Следуйте пошаговой процедуре с картинок:
  3. введите описание изображения здесь
  4. введите описание изображения здесь
  5. введите описание изображения здесь
  6. введите описание изображения здесь

У меня сам был установлен WinRaR, поэтому я решил продемонстрировать в нем обходной путь.
Этот обходной путь также возможен при использовании 7zip.

Еще одна вещь, которую я должен упомянуть, заключается в том, что, как кажется, проблема вызвана использованием проводника Windows, и любой другой файловый браузер (например, сам файловый браузер winrar, ftp-проводники и т. Д.) Будет обрабатывать эти файлы как обычно.
Вы можете попробовать использовать любой файловый браузер и просто удалить эти файлы, не беспокоясь об их архивировании! Ура!

Амир Хоссейн
источник
6
Какое креативное решение!
Nosgoroth
8

Когда вы видите имя «а.», Но на самом деле имя «а ..»

Попробуй это:

rd /q /s "C:\a..\"

И вы можете попробовать исследовать папку с помощью этого кода:

for /f "tokens=3 delims=<>" %%a in ('dir /ad /x "C:\*" ^| findstr " a\.\.$"') do (
  for /f "tokens=1" %%b in ("%%a") do start "" "%%~fb"
)
неоробин
источник
8

Если у вас установлен git (вы можете получить его отсюда ), то это очень просто:

  1. Перейдите в проводник к месту, где находится проблемная папка.
  2. Контекстное меню (правая кнопка мыши)> Git Bash Здесь.
  3. rm -rf Foldername./
Лауринас Лазаускас
источник
rm: cannot remove ‘.bin’: Directory not empty
Green
@Green, если у вас есть разрешения на удаление содержимого папки, -rfчасть должна позаботиться о содержимом папки.
Лауринас Лазаускас
5

Я использовал " WinRar " простой процессор RAR, ZIP. Вы можете использовать любой редактор имен файлов. Просто откройте каталог, в котором находится ваш файл, в WinRar и выберите переименовать, щелкнув правой кнопкой мыши файл / папку, которые вы хотите переименовать, и введите новое имя.

Арийский
источник
Как это должно помочь?
Таво
1
Помогает вам просмотреть файл / папку и переименовать файл во что угодно ... и готово.
Aryan
1
Это действительно помогло мне; Я использовал WinRar для распаковки кучи файлов, в одном из которых была папка, оканчивающаяся точкой. Windows не могла удалить или переименовать его, но я мог без проблем переименовать его в WinRar, а затем удалить в проводнике Windows (win 10). Благодарность!
Ник может
2

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

RyuuGan
источник
3
Мне интересно, как анлокер может это сделать!
jerry.liu 02
0

Используйте команду bash rm из Ubuntu в Windows 10

Крекер
источник
rm: cannot remove ‘.bin’: Directory not empty
Green
0

если вы хотите сохранить параметры файлов, также есть в bash.
вам потребуется пакет Windows Subsystem for Linux (у меня установлена ​​Ubuntu)

хранить файлы. откройте командную строку и перейдите к тому месту, где находится файл или папка.
теперь введите " bash",
это откроет bash в командной строке. теперь введите mv '[folder or file you want to move]' '[new name (can include path)]'(есть больше для mv, поэтому, если вы хотите прочитать все его параметры, используйте 'man mv', это откроет его страницу руководства (затем используйте q, чтобы вернуться в bash))
команда mv является сокращением для перемещения, но ее имеет второстепенную функцию переименования вещей.
также в bash используйте «одинарные кавычки», а не обычные «двойные кавычки», поскольку bash ожидает «одинарных кавычек».

вот пример. Предположим, что ваша папка с именем " data 1." расположена в c:\users(так что полный путь к папке с ошибкой: c:\users\data 1.
1. откройте командную строку любым способом
2. введите cd c:\users
3. теперь введите, bashэто загружает bash в папку, в которой вы раньше находились
4. наконец, введите mv 'data 1.' 'data 1'
5. Теперь папка доступна, и вы можете удалить ее.

mer2329
источник