Caractères autorisés dans le nom de fichier


139

Où puis-je trouver une liste des caractères autorisés dans les noms de fichiers, en fonction du système d'exploitation? (par exemple sous Linux, le caractère :est autorisé dans les noms de fichiers, mais pas sous Windows)


.NET fournit ces informations pour Windows.
leppie


8
@kreker note que votre question concerne Android
congusbongus


Réponses:


107

Vous devriez commencer par la page de nom de fichier Wikipedia . Il a un tableau de taille décente ( comparaison des limitations de noms de fichiers ), répertoriant les caractères réservés pour un grand nombre de systèmes de fichiers.

Il a également une pléthore d' autres informations sur chaque système de fichiers, y compris les noms de fichiers réservés tels que CONsous MS-DOS. Je mentionne cela uniquement parce que j'ai été mordu par cela une fois lorsque j'ai raccourci un fichier d'inclusion de const.hà con.het passé une demi-heure à comprendre pourquoi le compilateur se bloquait.

Il s'avère que DOS ignorait les extensions pour les périphériques, ce qui con.hétait exactement la même chose que conla console d'entrée (ce qui signifie, bien sûr, que le compilateur attendait que je saisisse le fichier d' en -tête avant de continuer).


4
Je trouve la page Wikipedia un peu vague et déroutante, par exemple "Certains systèmes d'exploitation interdisent certains caractères particuliers ...". Je recherche en fait un tableau complet qui répertorie tous les caractères autorisés et non autorisés.
mec python

7
@python, ne regardez pas ce tableau, regardez le grand honkin 'en dessous (intitulé "Comparison of file name limitations"). Ce n'est pas si vague dans son contenu.
paxdiablo

52
Tout ce dont vous avez probablement besoin est probablement de regarder l' POSIX "Fully portable filenames"entrée, qui énumère ceux-ci:A–Z a–z 0–9 . _ -
Vladimir Kornea


1
@CpILL Il existe plus de systèmes d'exploitation que Windows, OSX et Linux ... certains ont des systèmes de fichiers très simples.
dés élégants

33

OK, alors regardez la comparaison des systèmes de fichiers si vous ne vous souciez que des principaux systèmes de fichiers des joueurs:

de sorte que tout octet sauf NUL, \, /, :, *, ", <, >, |et vous ne pouvez pas avoir des fichiers / dossiers appel .ou ..et pas de caractères de contrôle (bien sûr).


7
Ce n'est pas correct. Linux ne le permet pas /. Windows n'autorise pas la barre oblique inverse et certaines chaînes (par exemple CON).
kgadek

7
ouais, donc j'ai dit sauf .
CpILL

2
Sur Mac (exécutant HFS +), je suis capable de créer des fichiers avec :s dans leurs noms.
erwaman

Ce n'est pas correct. Voir cette réponse pour plus de caractères que Windows n'autorise pas.
mbomb007

Windows n'autorise aucun caractère de contrôle non plus (mais le Mac le fait, autre que NUL)
Thomas Tempelmann

23

Sous Windows, créez un fichier et donnez-lui un caractère invalide comme \dans le nom du fichier. En conséquence, vous obtiendrez une fenêtre contextuelle avec tous les caractères invalides dans un nom de fichier.

entrez la description de l'image ici


5

Pour être plus précis sur Mac OS X (maintenant appelé MacOS) /dans le Finder est interprété :dans le système de fichiers Unix.

Cela a été fait pour la compatibilité descendante lorsque Apple est passé de Mac OS classique.

Il est légitime d'utiliser un /dans un nom de fichier dans le Finder, en regardant le même fichier dans le terminal, il apparaîtra avec un :.

Et cela fonctionne aussi dans l'autre sens: vous ne pouvez pas utiliser un /dans un nom de fichier avec le terminal, mais a :est OK et apparaîtra comme un /dans le Finder.

Certaines applications peuvent être plus restrictives et interdire les deux caractères pour éviter toute confusion ou parce qu'elles ont conservé la logique de l'ancien Mac OS classique ou pour la compatibilité des noms entre les plates-formes.


0

Pour les noms de fichiers "English locale", cela fonctionne très bien. J'utilise ceci pour nettoyer les noms de fichiers téléchargés. Le nom du fichier n'est pas destiné à être lié à quoi que ce soit sur le disque, c'est pour lorsque le fichier est en cours de téléchargement, il n'y a donc pas de vérification de chemin.

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

Fondamentalement, il supprime tous les caractères non imprimables et réservés pour Windows et d'autres systèmes d'exploitation. Vous pouvez facilement étendre le modèle pour prendre en charge d'autres paramètres régionaux et fonctionnalités.


-1

Voici le code pour nettoyer le nom du fichier en 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
Le code ne vérifie pas les noms non valides (réservés) et ne vérifie pas non plus un caractère non valide dans replace_space_with. La longueur du nom de fichier est hors de portée. Donc, ce :return: a valid name for Win/Mac/Linuxn'est pas vrai en toutes circonstances.
ack
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.