Где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы? (например, в Linux символ :
разрешен в именах файлов, но не в Windows)
Разрешенные символы в имени файла
Ответ 1
Вы должны начать со страницы имени файла в Википедии. Он имеет таблицу приличного размера (Сравнение ограничений имени файла), в которой перечислены зарезервированные символы для довольно большого количества файловых систем.
У этого также есть множество другой информации о каждой файловой системе, включая зарезервированные имена файла, такие как CON
под MS-DOS. Я упоминаю об этом только потому, что однажды меня это const.h
когда я сократил файл включения с const.h
до con.h
и потратил полчаса, чтобы выяснить, почему компилятор завис.
Оказывается, DOS игнорировал расширения для устройств, так что con.h
был точно таким же, как con
, консоль ввода (то есть, разумеется, компилятор ждал, пока я наберу в заголовочном файле, прежде чем он продолжит работу).
Ответ 2
В ОС Windows создайте файл и дайте ему недопустимый символ типа \
в имени файла. В результате вы получите всплывающее окно со всеми недопустимыми символами в имени файла.
Ответ 3
Хорошо, так что смотрите Сравнение файловых систем, если вам нужны только основные проигрыватели файловых систем:
- Windows (FAT32, NTFS): любой Юникод, кроме
NUL
,\
,/
,:
,*
,"
,<
,>
,|
- Mac (HFS, HFS+): любой действительный Unicode, кроме
:
или/
- Linux (ext [2-4]): любой байт, кроме
NUL
или/
поэтому любой байт, кроме NUL
, \
, /
, :
, *
, "
, <
, >
, |
и вы не можете вызывать файлы/папки .
или ..
и никаких управляющих символов (конечно).
Ответ 4
Чтобы быть более точным о Mac OS X (теперь называется MacOS) /
в Finder интерпретируется как :
в файловой системе Unix.
Это было сделано для обратной совместимости, когда Apple перешла с Classic Mac OS.
Допустимо использовать /
в имени файла в Finder, просматривая тот же файл в терминале, который будет отображаться с :
И это работает и наоборот: вы не можете использовать /
в имени файла с терминалом, но a :
все в порядке и будет отображаться как /
в Finder.
Некоторые приложения могут быть более строгими и запрещать оба символа во избежание путаницы или из-за того, что они сохраняли логику из предыдущих Classic Mac OS или для совместимости имен между платформами.
Ответ 5
Для имен файлов "English locale" это работает хорошо. Я использую это для дезинфекции загруженных имен файлов. Имя файла не предназначено для связи с чем-либо на диске, оно предназначено для загрузки файла, поэтому проверки пути отсутствуют.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
В основном он удаляет все непечатаемые и зарезервированные символы для Windows и других ОС. Вы можете легко расширить шаблон для поддержки других локалей и функций.
Ответ 6
Вот код для очистки имени файла в 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: https://stackoverflow.com/info/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