Допустимые символы в имени файла


где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы? (например, в Linux, символ : разрешен в именах файлов, но не в Windows)

5 93

5 ответов:

вы можете начать с Wikipedia Filename страница. Он имеет довольно приличного размера таблицы (сравнение ограничений имени файла) список зарезервированных символов для довольно большого количества файловых систем.

а также зарезервированные имена файлов, такие как CON под MS-DOS. Я помню, что был укушен этим однажды, когда я сократил include file from const.h to con.h и потратил полчаса, выясняя, почему компилятор завис. Получается Дос проигнорировали расширения для устройств, так что con.h было точно так же, как con, консоль ввода (что означает, конечно, компилятор ждал меня тип файл заголовка, прежде чем он продолжится).

в ОС Windows создайте файл и дайте ему недопустимый символ, например \ в имя файла. В результате вы получите всплывающее окно со всеми недопустимыми символами в имени файла.

enter image description here

хорошо, так глядя на сравнение файловых систем если вас волнуют только основные проигрыватели файловых систем:

  • 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