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)

mec python
la source
.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).

paxdiablo
la source
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
@VladimirKornea merci! Liens: pubs.opengroup.org/onlinepubs/9699919799/basedefs/… || pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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).

CpILL
la source
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

Devid
la source
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.

Jean Létourneau
la source
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.

TheRealChx101
la source
-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
Du D.
la source
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