Як видалити папку, назва якої закінчувалася крапкою («.»)?


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викликає ця команда?


Я не можу повірити, що це все ще відбувається в Windows 10, шляхом самого оновлення Windows (не вдалося видалити Windows.old після оновлення).
Чорт Овочі,

Відповіді:


147

Ось рішення цієї проблеми :

rd /s "\\?\C:\Documents and Settings\User\Desktop\Annoying Folder."

1
Питання вимагає, щоб функція API видалила папку, і стверджує, що її можна видалити за допомогою rd.
Jcl

4
Досить справедливо - можливо, саме тому він не позначений як прийнята відповідь, але, тим не менш, він дуже корисний для тих, хто користується такою ж проблемою, але там, де ми можемо використовувати rd.
david.barkhuizen

2
Ви щойно врятували мої нерви. Дякую! : D
Бенні Нойгебауер

8
Зверніть увагу, що це працює лише від CMD.exe NOT 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? rdin pwsh - це псевдонім, remove-itemякий не підтримує `\\? \`.
Kagami Sascha Rosylight

1
Звичайно, це так. Я просто використовував rd PowerShell для видалення такого файлу, і він працював чудово. Перевірте синтаксис.
SilverbackNet

Ого. Натрапивши на цю проблему, намагаючись виконати деяку обробку природної мови на наборі даних (кожен файл у наборі даних називається {IncrementalNumber}.), і я був дуже збентежений, чому мої сценарії обробки даних не працюють. Зараз це має сенс, але, схоже, поведінка настільки несподівана, що може мати наслідки для безпеки через те, що програми неправильно обробляють імена файлів, що закінчуються пробілом або крапкою.
Спенсер D

46

Я розмістив це на SU, і я вирішив також розмістити його тут. Це найпростіший, найшвидший і найпростіший спосіб цього досягти. Зараз я сміюся з того, наскільки це просто.

  1. Встановіть WinRAR
  2. Дотримуйтесь покрокової процедури із зображень:
  3. введіть тут опис зображення
  4. введіть тут опис зображення
  5. введіть тут опис зображення
  6. введіть тут опис зображення

Я сам встановив WinRaR, тому вирішив продемонструвати обхідний шлях у ньому.
Цей обхідний шлях також можливий за допомогою 7zip.

Ще одне, що я повинен згадати, це те, що, як видається, проблема викликана використанням провідника Windows та будь-якого іншого браузера файлів (наприклад, сам браузер файлів winrar, ftp explores тощо) буде обробляти ці файли як звичайне.
Ви можете спробувати скористатися будь-яким файловим браузером і просто видалити ці файли і не турбуватися про їх архівування! На здоров’я!


6
Яке креативне рішення!
Носгорот

8

Якщо у вас встановлений git (ви можете отримати ir звідси ), то це так просто, як:

  1. Перейдіть до Провідника файлів до місця, де знаходиться проблемна папка.
  2. Контекстне меню (права кнопка миші)> Git Bash Here.
  3. rm -rf Foldername./

rm: cannot remove ‘.bin’: Directory not empty
Зелений

@Green, якщо у вас є дозволи на видалення вмісту папки, -rfчастина повинна піклуватися про вміст папки.
Laurynas Lazauskas

7

Коли ви бачите ім'я "а.", А справжнє ім'я "а .."

Спробуйте це:

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"
)

5

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


Як це повинно допомогти?
Таво

1
Допомагає переглядати файл / папку та перейменовувати файл у будь-який ... і готовий.
Арій

1
Це насправді мені допомогло; Я використовував WinRar, щоб розпакувати купу файлів, один з яких включав папку, що закінчується крапкою. Windows не змогла його видалити або по-справжньому перейменувати, але я міг перейменувати це без проблем в WinRar, а потім видалити в Провіднику Windows (win 10). Дякую!
Нік,

2

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


3
Мені цікаво, як це можна розблокувати!
jerry.liu


0

якщо ви також хочете зберегти параметри файлів у bash.
вам знадобиться пакет підсистеми Windows для 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. папка тепер доступна, і ви можете її видалити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.