Где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы? (например, в Linux символ :допускается в именах файлов, но не в Windows)
Где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы? (например, в Linux символ :допускается в именах файлов, но не в Windows)
Ответы:
Вы должны начать со страницы Wikipedia Filename . У него есть таблица приличного размера ( Сравнение ограничений имени файла ), в которой перечислены зарезервированные символы для довольно большого количества файловых систем.
У этого также есть множество другой информации о каждой файловой системе, включая зарезервированные имена файла, такие как CONпод MS-DOS. Я упоминаю об этом только потому, что однажды меня это укусило, когда я укоротил включаемый файл с const.hдо con.hи потратил полчаса, чтобы выяснить, почему завис компилятор.
Получается, что DOS игнорирует расширения для устройств так, чтобы они con.hбыли точно такими же, как conи консоль ввода (то есть, разумеется, компилятор ждал, пока я наберу заголовочный файл, прежде чем он продолжится).
POSIX "Fully portable filenames"запись, в которой перечислены эти:A–Z a–z 0–9 . _ -
Хорошо, так что смотрите Сравнение файловых систем, если вам нужны только основные проигрыватели файловых систем:
NUL, \, /, :, *, ", <, >, |. Кроме того, нет пробела в начале или конце, и нет точки в конце .:или/NULили/поэтому любой байт , за исключением NUL, \, /, :, *, ", <, >, |и вы не можете иметь файлы / папки не называйте .или ..и не управляющие символы (конечно).
/. Windows не допускает обратную косую черту и некоторые строки (например CON).
:именами s.
Чтобы быть более точным о Mac OS X (теперь называется MacOS) /в Finder интерпретируется :в файловой системе Unix.
Это было сделано для обратной совместимости, когда Apple перешла с Classic Mac OS.
Допустимо использовать /имя файла в Finder, просматривая тот же файл в терминале, который будет отображаться с :.
И это работает и наоборот: вы не можете использовать /в имени файла с терминалом, но в :порядке и будет отображаться как /в Finder.
Некоторые приложения могут быть более строгими и запрещать оба символа во избежание путаницы или из-за того, что они сохраняли логику из предыдущих Classic Mac OS или для совместимости имен между платформами.
Для имен файлов "English locale" это работает хорошо. Я использую это для очистки имен загружаемых файлов. Имя файла не предназначено для связи с чем-либо на диске, оно предназначено для загрузки файла, поэтому проверки пути отсутствуют.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
В основном он удаляет все непечатаемые и зарезервированные символы для Windows и других ОС. Вы можете легко расширить шаблон для поддержки других локалей и функций.
Вот код для очистки имени файла в python.
import unicodedata
def clean_name(name, replace_space_with=None):
"""
Remove invalid file name chars from the specified name
:param name: the file name
:param replace_space_with: if not none replace space with this string
:return: a valid name for Win/Mac/Linux
"""
# ref: https://en.wikipedia.org/wiki/Filename
# ref: /programming/4814040/allowed-characters-in-filename
# No control chars, no: /, \, ?, %, *, :, |, ", <, >
# remove control chars
name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
if replace_space_with is not None:
return cleaned_name.replace(' ', replace_space_with)
return cleaned_name
:return: a valid name for Win/Mac/Linuxэто не так при любых обстоятельствах.