Допустимые символы в имени файла
где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы?
(например, в Linux, символ :
разрешен в именах файлов, но не в Windows)
5 ответов:
вы можете начать с Wikipedia Filename страница. Он имеет довольно приличного размера таблицы (сравнение ограничений имени файла) список зарезервированных символов для довольно большого количества файловых систем.
а также зарезервированные имена файлов, такие как
CON
под MS-DOS. Я помню, что был укушен этим однажды, когда я сократил include file fromconst.h
tocon.h
и потратил полчаса, выясняя, почему компилятор завис. Получается Дос проигнорировали расширения для устройств, так чтоcon.h
было точно так же, какcon
, консоль ввода (что означает, конечно, компилятор ждал меня тип файл заголовка, прежде чем он продолжится).
хорошо, так глядя на сравнение файловых систем если вас волнуют только основные проигрыватели файловых систем:
- Windows (FAT32, NTFS): любой Unicode, кроме
NUL
,\
,/
,:
,*
,"
,<
,>
,|
- Mac (HFS, HFS+): любой допустимый Юникод, кроме
:
или/
- Linux (ext[2-4]): любой байт, кроме
NUL
или/
так что любой байт, за исключением
NUL
,\
,/
,:
,*
,"
,<
,>
,|
и вы не можете иметь файлы/папки называть.
или..
и никаких управляющих символов (конечно).
чтобы быть более точным о Mac OS X (теперь называется MacOS)
/
в Finder интерпретируется как:
в файловой системе Unix.это было сделано для обратной совместимости, когда Apple перешла от классической Mac OS.
законно использовать
/
в имени файла в Finder, глядя на тот же файл в терминале он будет отображаться с:
.и это работает и наоборот: вы не можете использовать
/
в имени файла с именем терминал, но:
в порядке и будет отображаться как/
в Finder.некоторые приложения могут быть более ограничительными и запрещать оба символа, чтобы избежать путаницы или потому, что они сохранили логику из предыдущей классической Mac OS или для совместимости имен между платформами.
вот код для очистки имени файла в 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/questions/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