Разрешенные символы в имени файла

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