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


139

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


.NET предоставляет эту информацию для Windows.
Леппи


8
@kreker обратите внимание, что ваш вопрос касается Android
congusbongus


Ответы:


107

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

У этого также есть множество другой информации о каждой файловой системе, включая зарезервированные имена файла, такие как CONпод MS-DOS. Я упоминаю об этом только потому, что однажды меня это укусило, когда я укоротил включаемый файл с const.hдо con.hи потратил полчаса, чтобы выяснить, почему завис компилятор.

Получается, что DOS игнорирует расширения для устройств так, чтобы они con.hбыли точно такими же, как conи консоль ввода (то есть, разумеется, компилятор ждал, пока я наберу заголовочный файл, прежде чем он продолжится).


4
Я нахожу страницу Википедии несколько расплывчатой ​​и запутанной, например, «Некоторые операционные системы запрещают некоторые конкретные символы ...». Я на самом деле ищу полную таблицу, в которой перечислены все разрешенные и запрещенные символы.
питон чувак

7
@ Python, не смотрите на эту таблицу, посмотрите на большой хонкин под ней (озаглавленный «Сравнение ограничений имени файла»). Это не так расплывчато по своему содержанию.
paxdiablo

52
Вероятно, все, что вам нужно, это посмотреть на POSIX "Fully portable filenames"запись, в которой перечислены эти:A–Z a–z 0–9 . _ -
Владимир Корнея


1
@CpILL Есть больше ОС, чем просто Windows, OSX и Linux ... у некоторых очень простые файловые системы.
элегантные кости

33

Хорошо, так что смотрите Сравнение файловых систем, если вам нужны только основные проигрыватели файловых систем:

поэтому любой байт , за исключением NUL, \, /, :, *, ", <, >, |и вы не можете иметь файлы / папки не называйте .или ..и не управляющие символы (конечно).


7
Это не правильно. Linux не позволяет /. Windows не допускает обратную косую черту и некоторые строки (например CON).
кгадек

7
да, поэтому я сказал, кроме .
CpILL

2
На Mac (под управлением HFS +) я могу создавать файлы с :именами s.
erwaman

Это не правильно. Посмотрите этот ответ для большего количества символов, которые Windows не позволяет.
mbomb007

Windows также не допускает никаких символов управления (но Mac разрешает, кроме NUL)
Томас Темпельманн

23

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

введите описание изображения здесь


5

Чтобы быть более точным о Mac OS X (теперь называется MacOS) /в Finder интерпретируется :в файловой системе Unix.

Это было сделано для обратной совместимости, когда Apple перешла с Classic Mac OS.

Допустимо использовать /имя файла в Finder, просматривая тот же файл в терминале, который будет отображаться с :.

И это работает и наоборот: вы не можете использовать /в имени файла с терминалом, но в :порядке и будет отображаться как /в Finder.

Некоторые приложения могут быть более строгими и запрещать оба символа во избежание путаницы или из-за того, что они сохраняли логику из предыдущих Classic Mac OS или для совместимости имен между платформами.


0

Для имен файлов "English locale" это работает хорошо. Я использую это для очистки имен загружаемых файлов. Имя файла не предназначено для связи с чем-либо на диске, оно предназначено для загрузки файла, поэтому проверки пути отсутствуют.

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

В основном он удаляет все непечатаемые и зарезервированные символы для Windows и других ОС. Вы можете легко расширить шаблон для поддержки других локалей и функций.


-1

Вот код для очистки имени файла в 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

2
Код не проверяет недействительные (зарезервированные) имена и не проверяет недопустимый символ в replace_space_with. Длина имени файла выходит за рамки. Таким образом, :return: a valid name for Win/Mac/Linuxэто не так при любых обстоятельствах.
извед
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.