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)
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)
Réponses:
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 CON
sous 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.h
et 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 con
la 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).
POSIX "Fully portable filenames"
entrée, qui énumère ceux-ci:A–Z a–z 0–9 . _ -
OK, alors regardez la comparaison des systèmes de fichiers si vous ne vous souciez que des principaux systèmes de fichiers des joueurs:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. De plus, pas de caractère espace au début ou à la fin, et pas de point à la fin .:
ou/
NUL
ou/
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).
/
. Windows n'autorise pas la barre oblique inverse et certaines chaînes (par exemple CON
).
:
s dans leurs noms.
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.
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.
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
:return: a valid name for Win/Mac/Linux
n'est pas vrai en toutes circonstances.