Чому цього файлу, мабуть, не існує при спробі його видалити?


9

Місяць і тому назад я розкручував джерело Linux у папці Cygwin (мені було цікаво, чи буде він компілюватись з MinGW, оскільки мій інший комп'ютер під управлінням Linux - це повільний одноядерний Sempron). Я спробував її видалити, але залишився 1 файл, і він не видалиться ...

Cygwin проживає в C:\cygwin, і я знімав джерело в C:\cygwin\src\linux-3.7.1. Він не компілювався ... Тому я спробував видалити папку. Це йшло добре, до кінця, коли я зрозумів, що не всі файли видалено. Я linux-3.7.1знову спробував видалити папку, і з’явилася помилка:

Елемент не знайдено

Я відкрив папку, і виявив , що є один вихідний файл зліва aux.c, який знаходиться в C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c.

Я не буду:

  • Видалити
  • відчинено
  • Рухатися

Загальні властивості:

Загальні

Властивості безпеки:

Безпека

Як видалити цей файл?


Гаразд, запускаючи його на даний момент
Алекс

Зробив, хоча не працював ...
Алекс

1
Не повинен працювати. Неможливо видалити його зсередини DOS / Windows, як задумано. Таким чином, це не помилка, яку ви можете виправити таким чином.
Hennes

Відповіді:


14

Спробуйте це з командного рядка (підвищеного):

del \\?\C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c

Ок aux.cвидалено, але тепер папка `src`, мабуть, використовується, коли я намагаюся видалити це
Алекс

У ній нічого прихованого? Можливо rd /s /q \\?\C:\cygwin\src, допоможе.
Каран

Друкує вихід, що використовується `src`
Алекс

2
Каран: О, розумний. Уникання звичайного простору імен файлової системи. @ Алекс Ян: У папці не відкрито вікно cmd?
Геннес

Так, rd повинен зробити трюк, якщо щось не захопить папку чи файл всередині неї ... Закрийте всі інші відкриті вікна / програми та перевірте властивості src. Який розмір і кількість файлів всередині відображаються?
Каран

13

Проблема, з якою ви зіткнулися, пов’язана з давніми застереженнями DOS.

Файли зі списку нижче мали особливі значення. Частина цього все ще присутня у сучасних версіях Windows:

CON, PRN, AUX , CLOCK $, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 та LPT9.

Найпростіший спосіб їх видалення - це завантаження операційної системи, яка не сприймає ці файли як особливі. (наприклад, завантажуйте будь-який живий диск, який не є Windows).

[редагувати] Тести, зроблені на програмі win7-x86 ultimate:

Створення простого тестового файлу:

S: \> скопіюйте con foo.c
тест
^ Z
        Скопійовано 1 файл (и).

Перевірка вмісту:

S: \> введіть foo.c
тест

Тепер з aux .c

S: \> копіювати con aux.c
^ Z
Система не може знайти вказаний файл.
        Скопійовано 0 файлів.

Здається, частина вікон все ще сумісна назад.


Але цей файлaux.c
Алекс

3
Він все ще починається з aux, і старий стиль назви файлу - "Filename" dot "розширення". І я просто тестував copy con aux.cна win7, і це не вдалося. ( copy con test.cпрацює).
Hennes

7

У цьому випадку, очевидно, мова йшла про особливий сенс, auxуспадкований з часів DOS , як правильно вказав Геннес . Однак для читачів, які спотикаються про це в майбутньому, я хотів би додати ще один можливий випадок, коли така поведінка може бути помічена.

Ось тоді було створено файл із крапкою. Є і більш екзотичні випадки. Але це filename.ext.було б таке ім'я файлу і його не можна було нормально видалити з підсистеми Win32. Ось тут і приходить фокус від Karan . Він / він використовує ім'я, яке перед тим, як перейти на шар під підсистемою Win32, буде змінено з своєї \\?\C:\...форми на "рідну" (це також бачать драйвери фільтрів файлової системи) форма \??\C:\.... Тоді як залежно від версії Windows, це може бути так званий об'єктний каталог (використовуйте WinObj від Sysinternals / Microsoft, щоб зазирнути в область імен менеджера об'єктів) або символічне посилання (не плутати з ідентично названим об'єктом у NTFS з Vista) до іншого каталогу об'єктів, наприклад\DosDevices. Останнє - це лише одне ім’я та описує частину простору імен менеджера об'єктів, видиму процесам Win32 за замовчуванням. Щоб отримати докладніші відомості, ознайомтеся з серією книг Windows Internals або прочитайте інформацію про розбір шляхів, зокрема, на Google Project Project Zero (Поточний посібник з конвертації шляху Win32 до NT) . Зокрема, ви можете звернути увагу на різницю між просторами імен файлів Win32 та просторами імен пристроїв Win32 .

Тепер, як можна створити такий файл в першу чергу? Існує кілька можливостей.

  1. програма Win32, яка використовує \\?\X:префікс для імен шляхів, щоб розширити доступну довжину шляху з 260 символів до приблизно 32767 символів (див. виноску 1!), створила файл в першу чергу, тим самим обійшовши деякі обмеження підсистеми Win32.
  2. програма, що вкорінена в іншій підсистемі. Була створена колишня підсистема POSIX (пізніше Interix тепер SUA), підсистема OS / 2 (давно минула, але існувала на NT 3.51) або якийсь шар, який не є точно підсистемою в сенсі Windows (Cygwin, наскільки мені відомо) файл або папку. Так само WSL (підсистема Windows для Linux) в Windows 10 тепер є ще одним кандидатом.
  3. інша операційна система створила його (наприклад, паралельне завантаження Linux).
  4. це файл на мережевій папці, розміщеній на сервері, який не є Windows.

Останні два пункти також натякають на один із згаданих способів усунення: завантажте живий компакт-диск, який не є Windows, та видаліть файли (файли).

Проблема може насправді порівнятись із випадком, коли стара програма Unicode Win32 стикається з назви файлів з декількох сторінок коду. Часто він не зможе "знайти" деякі з них, оскільки кожна відповідна кодова сторінка ANSI може вміщувати лише 256 символів, тоді як UTF-16 (але не її підмножина UCS-2, проте) теоретично може кодувати практично необмежену кількість кодових очок (читайте по темі на unicode.org та Wikipedia ).

Сподіваюсь, це допоможе зрозуміти основні проблеми трохи більше. Не хотів редагувати цю довгу відповідь в одну з інших відповідей, хоча вона лише доповнює їх. Інші відповіді цілком справедливі без цієї.


Виноска 1: максимальна кількість символів на шляху не є абсолютною, оскільки шлях, близький до абсолютного максимуму (32767 символів), може бути розширений як керуючим об'єктом, так і фільтрами файлової системи або самими файловими системами (наприклад, повторно розгорнути точки) .


Мені подобається доданий технічний досвід.
Геннес

0

У мене було це питання, і я був дуже засмучений, нічого не вийшло. Тоді я використав компакт-диск Linux Ubuntu. Завантажившись з CDROM, перейшов у демонстраційний режим, відкрив там, де були клопітні файли, та просто видалив їх. Це працює як сон.


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