Остальные ответы до сих пор кажутся правильными в отношении * nix стороны, но я добавлю предупреждение об этом в Windows.
Вы были обмануты (бездействием) в документации.
MAX_PATH
действительно определено и, вероятно, применимо даже к файлам, хранящимся в FAT или FAT32. Однако любое имя пути может иметь префикс \\?\
, чтобы указать Windows API игнорировать MAX_PATH
и позволить драйверу файловой системы принять собственное решение. После этого определения становятся нечеткими.
Добавьте к смеси тот факт, что имена путей на самом деле являются Unicode (ну, UTS-16) и что при использовании API "ANSI" преобразование во внутреннее имя Unicode и из него зависит от множества факторов, включая текущая кодовая страница, и у вас есть рецепт для путаницы.
Хорошее описание правил для Windows: MSDN . Правила намного сложнее, чем я здесь изложил.
Редактировать: Я изменил \\.\
на \\?\
в приведенном выше благодаря комментарию от KitsuneYMG.
Пути и пространства имен Windows сложны. Некоторые могут даже утверждать, что они слишком сложны. Одним из источников сложности является то, что Win32 (а теперь и Win64) API - это подсистема, расположенная поверх собственной системы Windows NT.
Путь без префикса совместим с самыми разными платформами Windows. Если он ограничен 7-битными символами ASCII, то он совместим с 16-битной DOS начиная с версии 2.0 или около того (всякий раз, когда вводились подкаталоги, которые могли быть в DOS 3; но в DOS 1.0 были только корневые каталоги и \
символ не имел особого значения).
Префикс \\?\
приводит к тому, что баланс имени пути дословно передается соответствующему драйверу файловой системы, что приводит к уменьшению ограничения до MAX_PATH
символов. Если длинный путь также есть в общем сетевом ресурсе, вы можете использовать для него расширенное имя UNC с префиксом \\?\UNC\server\share\
вместо обычного имени UNC \\server\share\
. Использование этого префикса ограничивает переносимость для Win32 и более поздних платформ Windows, но если вам не требуется поддержка 16-битной Windows на устаревшем оборудовании, это не является большой проблемой.
Префикс \\.\
- это другое животное. Это позволяет получить доступ к объектам устройств за пределами набора устройств с особыми именами, которые автоматически сопоставляются Windows как специальные имена файлов в каждой папке файлов. К этим специальным именам относятся CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Обратите внимание, что все эти имена являются особыми, независимо от того, используется ли расширение или в любом сочетании верхнего или нижнего регистра. Но возможно, что у вас установлено 10 или более COM-портов. Это происходит быстро, если вы играете с USB-модемами или адаптерами последовательного порта USB, поскольку каждому уникальному последовательному порту на базе USB будет назначено отдельное имя COMn. Если вам нужен доступ к 50-му последовательному порту, вы можете сделать это только с именем \\.\COM50
, потому что COM50 - это , а не , а специальное имя, например, COM1, -
.
Страница MSDN, которую я цитировал выше, имела право на различие, я просто ввела неправильный префикс в своем исходном ответе.