Дозволені символи в імені файлу


139

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


.NET надає цю інформацію для Windows.
— леппі


8
@kreker зауважте, що ваше питання стосується Android
— congusbongus


Відповіді:


107

Ви повинні почати зі сторінки Імена файлу Вікіпедії . У ньому є пристосований розмір таблиці ( Порівняння обмежень імені файлів ), у якому перераховані зарезервовані символи для досить багатьох файлових систем.

У ньому також є безліч іншої інформації про кожну файлову систему, включаючи зарезервовані імена файлів, наприклад, 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).
— kgadek

7
так, отже, я сказав, крім .
— CpILL

2
На Mac (під управлінням HFS +) я можу створювати файли з :s у своїх іменах.
— erwaman

Це неправильно. Дивіться цю відповідь, щоб отримати більше символів, які Windows не дозволяє.
— mbomb007

Windows також не дозволяє будь-яких знаків управління (але Mac робить, крім NUL)
— Thomas Tempelmann

23

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

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


5

Точніше щодо Mac OS X (зараз її називають MacOS) /у Finder інтерпретується :у файловій системі Unix.

Це було зроблено для зворотної сумісності, коли Apple перейшла з Classic Mac OS.

Законно використовувати /ім'я файлу у Finder, дивлячись на той самий файл у терміналі, на якому він відображатиметься з a :.

І це працює і навпаки: ви не можете використовувати /ім'я файлу з терміналом, але a :- це нормально і відображатиметься як /Finder.

Деякі програми можуть бути більш обмежуючими і забороняють обом символам уникати плутанини або тому, що вони зберігали логіку попередньої класичної Mac OS або для сумісності імен між платформами.


0

Для імен файлів "англійська мова" це добре працює. Я використовую це для очищення завантажених імен файлів. Ім'я файлу не призначене для зв'язку з чим-небудь на диску, це коли завантажується файл, отже, немає перевірок шляху.

$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
Код не перевіряє недійсні (зарезервовані) імена, а також не перевіряє недійсні символи заміни_space_with. Довжина імені файлу не виходить за межі. Отже, :return: a valid name for Win/Mac/Linuxнеправда за будь-яких обставин.
— ак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.