Безопасны ли пути увеличенной длины?

Я только что наткнулся на эту статью в MSDN, которая говорит, что путь может состоять из 259 символов + завершение NUL, но если вы поставите перед ним префикс "\\? \", WinAPI позволит вам использовать

максимальная общая длина пути 32 767 символов.

Стремясь увидеть, как он работает, я попытался использовать этот префикс из Explorer (в XP SP3), но он вообще не работает (на любом пути). Если вы поместите \\?\C:\Path\to\an\existing.file на панель проводника, будет выдана ошибка «файл не найден».

Так что я в замешательстве. Могу ли я закодировать что-нибудь для (не древней) Windows, которое полностью использует указанный размер пути в NTFS? Почему Explorer его не использует?


person Camilo Martin    schedule 28.08.2010    source источник
comment
По крайней мере, работает в Windows 7. В XP, возможно, он работает при вызове функций API, но не при вводе путей в графическом интерфейсе explorer.exe (что может сразу позволить использовать пути произвольной длины)?   -  person Andreas Rejbrand    schedule 28.08.2010
comment
Ну, я видел программное обеспечение (не могу вспомнить, какое), которое создавало файлы в XP с путями больше 259, но Explorer не позволял мне использовать их правильно, даже не удалял их. Чтобы удалить их, мне пришлось переименовать родительские папки в более короткие имена.   -  person Camilo Martin    schedule 28.08.2010


Ответы (3)


Существует НАБОР вызовов API, которые работают с расширенными путями, а некоторые - нет. MSDN обычно упоминает об этом.

Дело не в том, что если вы просто введете этот путь в проводник Windows под XP, это не сработает, потому что расширенный синтаксис пути - это просто escape-последовательность для WIn32 API, а не для проводника Windows. В Win7 это действительно работает, потому что многие ожидали, что это сработает.

Также для длинных путей это действительно помогает, если вы измените рабочий каталог или откроете проводник с подкаталогом в качестве корня.

person Dominik Weber    schedule 28.08.2010
comment
Какие? это действительно помогает, если вы измените рабочий каталог или откроете проводник с подкаталогом в качестве корневого. Вы имеете в виду, что для Windows существует chroot? Или вы имеете в виду другое? - person Camilo Martin; 30.08.2010
comment
да, есть SetCurrentDirectory (). Возможно, я ошибаюсь, но в какой-то момент в прошлом я думал, что это помогло. По крайней мере, если приложение работает с относительными путями, а не с абсолютными. - person Dominik Weber; 30.08.2010
comment
Выбрал, потому что это было давно. - person Camilo Martin; 30.12.2011
comment
@CamiloMartin: chroot в Windows - это subst. Обратите внимание, что это не функция безопасности, как предполагается в Unix, а просто удобство. - person Gabe; 10.10.2013
comment
@Gabe приятно знать! Может пригодиться, если мне придется работать со скриптом, который не любит пробелы в путях. - person Camilo Martin; 12.10.2013

Прежде чем кто-нибудь скажет мне RTFM ...

Обратите внимание, что эти примеры предназначены для использования с функциями Windows API и не обязательно работают с приложениями оболочки Windows, такими как Windows Explorer.
[...]
Для файлового ввода-вывода "\\?" Префикс \ "к строке пути указывает API Windows отключить весь синтаксический анализ строки и отправить строку, которая следует за ним, прямо в файловую систему. Например, если файловая система поддерживает большие пути и имена файлов, вы можете превысить ограничения MAX_PATH, которые в противном случае применяются API Windows.

Во-вторых, это заставляет меня задуматься о возможностях скрытия файлов (или поиска таких файлов) в проводнике с помощью недопустимых имен файлов.

person Camilo Martin    schedule 28.08.2010

Вы спрашиваете, почему все компоненты в Windows не поддерживают его, или вы спрашиваете, законно ли использовать эти длинные пути?

Вы определенно можете безопасно использовать их, но вы можете раздражать тех, кто хочет использовать такие инструменты, как Explorer, для их просмотра. Мы постоянно видим такие тропы в дикой природе. Иногда люди очень удивляются, когда не могут использовать MY_FAVORITE_TOOL, чтобы удалить его ...

person jrtipton    schedule 29.08.2010
comment
На самом деле я думаю о разработке файлового браузера, который был бы менее глупым, чем Explorer. Я имею в виду, что NTFS предлагает мир Unix-подобных возможностей, которые просто не используются в XP. - person Camilo Martin; 30.08.2010
comment
edit: Я думаю о разработке файлового браузера = где-то между настоящим моментом и концом времени. - person Camilo Martin; 30.08.2010