Почему символы «<» и «>» повреждают папки Windows?

Я смотрел видео FlyTech , и когда он создал пару недопустимых папок (одну с именем «<», а другую с именем «>»), Windows подумала, что папка, содержащая их, повреждена. Такое поведение не наблюдалось ни в одной из других папок с недопустимыми символами.

Мне было интересно, почему эта конкретная комбинация заставляет Windows думать, что содержащаяся в ней папка повреждена. Я немного поискал и не смог найти, почему это может быть. Может ли кто-нибудь объяснить?

4 ответа

Ошибка вызвана не именно угловыми скобками или наличием двух из них — вместо этого она возникает, когда 1) имя файла содержит подстановочные знаки в своем имени и 2) подстановочный знак соответствует ранее просмотренному файлу , что приводит к ошибке Windows. думая, что поиск папок не продвигается вперед так, как должен.

Во-первых, насколько я понимаю, указание каталога в Windows осуществляется путем расширения подстановочных знаков (противоположно тому, как это делается в Linux). Чтобы расширить шаблон подстановочных знаков, вы начинаете с вызова FindFirstFile() с исходным шаблоном, затем повторяете FindNextFile(), пока NTFS находит соответствующие файлы один за другим. Чтобы просмотреть весь каталог, вы делаете то же самое, что и шаблон.

Во-вторых, оба и (а также ) на самом деле рассматриваются как подстановочные знаки в более глубоких частях кода обработки файлов Windows — они ведут себя как исторические варианты подстановочных знаков и . (Например, DOS_STAR соответствует всем символам вплоть до расширения файла.) Общедоступный исходный код .NET содержит описание алгоритма, идентичное тому, которое было найдено в просочившемся исходном коде ядра Windows NT.

Так что дело не только в угловых скобках, но и" ?которые могут быть использованы для возникновения этой ошибки – при условии, что они используются в сочетании с другим именем файла, которое будет сортироваться перед подстановочным знаком, если сортировка выполняется по значению Unicode (это порядок, установленный NTFS).

Например, вы также получите сообщение об ошибке «Папка повреждена», если у вас есть элементы с именами и . В этом нет ничего особенного(здесь, за исключением того, что в Юникоде он идет перед, а символ, который сортируется после такого, не вызовет ошибку. (Вы можете открыть «Карту символов» черезcharmap.exe, если хотите увидеть позиции этих символов в Юникоде.)

Аналогично, каталог, содержащий [foo<, ] или [,fooo] не вызовет такую ​​ситуацию, но каталог, содержащий [foo=,foo>] или [foo+,foo?] бы.

Итак, если я все правильно понимаю, то происходит следующее:

  1. В каталоге есть элементы [, ], причем NTFS обеспечивает именно этот порядок.
  2. Ядро запрашивает NTFS «Получить первый элемент, начиная с «».
  3. NTFS находит и возвращает .
  4. Ядро запрашивает NTFS «Получить следующий элемент, продолжая с».
  5. NTFS находит (точное совпадение) и возвращает следующий элемент.
  6. Ядро запрашивает NTFS «Получить следующий элемент, продолжая с».
  7. Находит NTFS – который распознается как подстановочный знак и соответствуетfoo(сначала, поэтому следующий элементfoo*еще раз – и возникает ошибка.

Поскольку обрабатывается аналогично*подстановочный знак, папка с именем ">" вызывает ту же проблему при сопоставлении с предыдущим "<" элемент перед собой.

Персонажи<и>принадлежат к группе «зарезервированных символов», которую нельзя использовать для имени файла или каталога в Windows.

https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

      The following reserved characters are not valid to name a file or directory:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Как отмечено в другом ответе, эти символы находятся в группе зарезервированных символов:

https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

      The following reserved characters are not valid to name a file or directory:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Для каждого из них есть вполне конкретные причины. Есть способы обойти их, но каждый из них выполняет фундаментальную функцию при обработке команд:

  • < (меньше чем) — ввод из файла
  • > (больше чем) — Вывод в файл
  • : (двоеточие) — идентификатор диска (например, C: )
  • " (двойная кавычка) — заключить в кавычки имя файла, содержащее пробелы.
  • / (косая черта) — разделитель папок/каталогов POSIX.
  • \ (обратная косая черта) — разделитель папок/каталогов Windows.
  • | (вертикальная черта или труба) — использовать выходные данные одного процесса в качестве входных данных для другого процесса.
  • ? (знак вопроса) — подстановочный знак, состоящий из одного символа.
  • * (звездочка) — подстановочный знак, состоящий из нескольких символов.

Эта сбивающая с толку ошибка может принимать разные формы, например:

  • Код ошибки 0x80070570
  • Код ошибки 0x570
  • Код ошибки 1392 (570 в шестнадцатеричном формате)
  • ОШИБКА_FILE_CORRUPT
  • Сообщение «Файл или каталог поврежден и не читается»

Типичное сообщение об ошибке:

Во всех случаях это означает, что к файлу или папке не удалось получить доступ, хотя они существуют в Главной таблице файлов NTFS (MFT).

Другие ответы хорошо объяснили, что некоторые символы в имени файла недопустимы.

Если удается создать файл, содержащий эти недопустимые символы, обычно с помощью Linux, для которого эти символы допустимы, то мы имеем аномалию: с одной стороны, файл/папка существует в таблице файлов, но с другой стороны любая попытка открыть его отвергается, поскольку его имя не проходит проверку.

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

Это сообщение об ошибке можно было бы сформулировать более четко, но оно означает, что существует противоречие между содержимым таблицы файлов и данными на диске, что для Windows означает «повреждение».

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

Другие вопросы по тегам