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


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.