Есть ли какой-либо символ, который является недопустимым в путях к файлам в каждой ОС?
Есть ли какой-нибудь символ, который гарантированно не появится ни в каком пути к файлу в Windows или Unix/Linux/OS X?
Мне это нужно, потому что я хочу объединить несколько путей к файлам в одну строку, а затем снова разделить их.
2 ответа
В комментариях Гарри Джонстон пишет:
Общее решение этого класса проблем заключается в кодировании путей к файлам перед их присоединением. Например, если вы имеете дело с однобайтовыми строками, вы можете преобразовать их в шестнадцатеричные строки; так что "привет" становится "68656c6c6f". (Очевидно, что это не самое эффективное решение!)
Это абсолютно правильно. Пожалуйста, не пытайтесь делать что-то "хитрое" с именами файлов и зарезервированными символами, потому что это в конечном итоге сломается в каком-то странном угловом случае, и у вашего преемника будет немало времени, чтобы попытаться исправить повреждение.
На самом деле, если вы пытаетесь быть переносимым, я настоятельно рекомендую вам никогда не пытаться создавать какие-либо имена файлов, включая любые символы, кроме [a-z0-9_]
, (Учтите, что общие файловые системы в Windows и OS X могут работать в режиме без учета регистра, где FooBar.txt
а также FOOBAR.TXT
один и тот же идентификатор.)
Достаточно компактная схема кодирования для практического использования будет состоять в создании "белого списка", такого как [a-z0-9_]
и закодировать любой символ ch
вне вашего "белого списка" как printf("_%2x", ch)
, Так hello.txt
становится hello_2etxt
, а также hello_world.txt
становится hello_5fworld_2etxt
, Так как каждый _
экранирован, вы можете использовать _
в качестве разделителя: закодированная строка hello_2etxt__goodbye___2e_2e
однозначно идентифицирует список имен файлов ['hello.txt', 'goodbye', '..']
,
Вы можете использовать символ новой строки, или, в частности, CR (десятичный код 13) или LF (десятичный код 10), если хотите. Подходит ли это или нет, зависит от того, какие требования вы предъявляете к отображению объединенной строки для пользователя - при таком подходе он печатает свои части в отдельных строках - что может быть очень хорошим или очень плохим для этой цели (или вы может пофиг...).
Если вам нужно объединить строку для печати в одну строку, отредактируйте свой вопрос, чтобы указать это дополнительное требование; и тогда мы можем идти оттуда.