Проводник Windows - почему символ @ не разрешен в именах файлов?

449
aleksusklim

Я знал много запрещенных и специальных символов в именах файлов и папок, которые невозможно использовать, иначе они могут вызвать проблемы позже.

Например, если поставить точку в конце имени, оно исчезнет.

Сам по себе Explorer имеет больше ограничений, например, очень трудно поставить точку в начале имени файла.

Хорошо, но что не так с at-sign @!?
Я нигде не видел никаких ограничений по этому поводу, и я не мог найти это сейчас.

Увидеть:

1) Откройте проводник Windows и создайте файл или папку с именем 1,1
2) Нажмите F2 и переименуйте его в @1,1
3) Видите? Новое имя было отменено.

Мой вопрос: ПОЧЕМУ?

Я протестировал эту «функцию» на XP, Win7 и Win10.
Забавная вещь в WinXP заключается в том, что переименование 0,0в @0,0фактически переименовывает его в @0.

Похоже, это внутреннее поведение проводника, потому что в консоли CMD это прекрасно cd.>"@1,1"

6
Я только что попробовал это на Windows 7, и я не могу воспроизвести ваш результат - я могу без проблем переименовать файл с помощью проводника в имя, которое содержит `@`. Scott 6 лет назад 0
@ Скотт, это как-то связано с запятой `,` особенно если после нее стоит число. `@` должен быть первым символом. Вы пробовали мой конкретный пример? Хм, это также может зависеть от локали… У меня есть русская локаль, где `,` - это разделитель для действительных чисел (1,5 означает 1,5 с половиной, а не 1,5, как в английской локали). aleksusklim 6 лет назад 0
Я сделал сейчас. Я взял файл PNG и переименовал его в `@ 0,0.png`, а затем просто в` @ 0,0`. Я получил предупреждение об изменении расширения, но когда я нажал OK, переименование сработало. (Я в США.) Scott 6 лет назад 0
@Scott, Ну, я не могу создать `@ 1,1.png` Похоже, локаль связана. Вы пробовали `@ 1,1` (так как @ 0,0 глючит только для XP, в Win7 и позже он прекрасно переименовывается), или, может быть, вы попробуете` @ 1.1`? Не уверен, что это покажет это, хотя. aleksusklim 6 лет назад 0
Ах, теперь я получаю странные результаты. Основываясь на 42 секундах тестирования, похоже, что попытки переименовать в `` @ 1,1`` молча провалились (оставив имя без изменений). Scott 6 лет назад 1
На такой вопрос «почему», который, по сути, спрашивает, о чем думали дизайнеры Microsoft, когда они решили это, обычно очень сложно ответить. В корне этого, Explorer не хочет, чтобы вы использовали @, потому что он был разработан таким образом. Но почему он был спроектирован таким образом ... мало кто узнает. Corrodias 6 лет назад 0
@Corrodias, На самом деле, мое «почему» также означает «есть ли что-то еще, связанное с этим, что я тоже должен учитывать?». Например, я прекрасно знаю, с чем столкнусь, если буду использовать символы, такие как `% & ^` в именах файлов (удачи, чтобы управлять ими в CMD позже ...), и я знаю, что именно вызывает эти проблемы. Но здесь я не знаю, ** почему ** почему `@` ведет себя так странно, поэтому я не знаю, какого еще использования я должен бояться. aleksusklim 6 лет назад 0

1 ответ на вопрос

7
grawity

Я не знаю, почему Explorer запрещает такие переименования, но, скорее всего, это связано с функцией локализации.

Various parts of Explorer use the @<DllName>,<ResourceID> syntax for dynamically loading localized text – see registry string redirection. (Note that the resource ID is always a decimal number, often negative.)

  • Например, описание ярлыков .lnk в реестре @shell32.dll,-4153означает «загрузить строку с идентификатором -4153 из файла shell32.dll». Поскольку файлы DLL могут иметь отдельную таблицу ресурсов для каждого поддерживаемого языка, результирующее описание будет переведено на любой язык отображения, установленный в Windows.

  • Точно так же ваш рабочий стол; Документы; Фотографий; ... каталоги имеют скрытый desktop.iniфайл, содержащий:

    [.ShellClassInfo] LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21769 IconResource=%SystemRoot%\system32\imageres.dll,-183 

    Когда проводник увидит этот файл, он не просто покажет папку как «Рабочий стол» - он покажет переведенное имя.

Простое использование синтаксиса перенаправления в реальном имени файла / каталога ничего не изменит, но я предполагаю, что было запрещено предотвращать различные ошибки в случае, если программа каким-то образом смешивает «настоящие» и «отображаемые» имена. (Например, если вы назовете каталог @shell32.dll,-21769, возможно, что программа с ошибками продолжит попытки доступа Desktop. Это может даже создать проблемы безопасности.)

Так что это будет похоже на различные другие имена, которые Windows разрешает, но Explorer не позволяет (например, .fooкоторый является обычным «скрытым файлом» для Unixen, но может быть ошибочно принят за файл без имени (только расширение) некоторыми программами Windows).

Боже мой, действительно! Почему я не подумал об этом. Эй, теперь я действительно пытался переименовать `test` _directory_ в` @ shell32.dll, -21769` в WinXP Explorer, и он волшебным образом переименовал его в визуальное имя `Рабочий стол` (" Desktop "на русском языке), которое содержит` desktop.ini` со строкой `LocalizedResourceName = @ shell32.dll, -21769`. Когда я попытался переименовать _file_ `test` - Explorer создал здесь desktop.ini с помощью` [LocalizedFileNames] `и` test = @ shell32.dll, -21769`. (Кроме того, этот материал «локализованного имени» сам по себе может вводить в заблуждение начинающего пользователя и, возможно, использоваться вредоносным ПО). aleksusklim 6 лет назад 3
Спасибо за ваши правки и уточнения. Итак, я думаю, что вместо этого я буду использовать префикс файла _ _ _ _ или мой старый `@ _`. На самом деле, это была моя схема именования загруженных видеофайлов: иногда я делаю резервную копию видео, чтобы смело удалять его, чтобы сэкономить место; но часто я не хочу удалять это немедленно, так как я еще не смотрел это. Итак, я использовал префикс @_ к имени файла, чтобы я мог легко различать резервные. В последнее время я нашел файл, который имел размер в названии, в виде «Видео (1,5 Гб) .mp4» - тогда моя схема не удалась на `@_ Видео (1,5 Гб) .mp4`. aleksusklim 6 лет назад 0