Есть ли какой-либо символ, который является недопустимым в путях к файлам в каждой ОС?

Есть ли какой-нибудь символ, который гарантированно не появится ни в каком пути к файлу в 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), если хотите. Подходит ли это или нет, зависит от того, какие требования вы предъявляете к отображению объединенной строки для пользователя - при таком подходе он печатает свои части в отдельных строках - что может быть очень хорошим или очень плохим для этой цели (или вы может пофиг...).

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

Другие вопросы по тегам