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