Почему символы «<» и «>» повреждают папки 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?
] бы.
Итак, если я все правильно понимаю, то происходит следующее:
- В каталоге есть элементы [, ], причем NTFS обеспечивает именно этот порядок.
- Ядро запрашивает NTFS «Получить первый элемент, начиная с «».
- NTFS находит и возвращает .
- Ядро запрашивает NTFS «Получить следующий элемент, продолжая с».
- NTFS находит (точное совпадение) и возвращает следующий элемент.
- Ядро запрашивает NTFS «Получить следующий элемент, продолжая с».
- Находит 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 означает «повреждение».
Сообщение не обязательно означает, что папка, содержащая файл с таким именем, повреждена. Это общее сообщение будет выдано для файла, а также для папки, имя которой содержит недопустимые символы.