Où puis-je trouver une liste de caractères autorisés dans les noms de fichiers, en fonction du système d'exploitation? (par exemple, sur Linux, le caractère :
est autorisé dans les noms de fichiers, mais pas sous Windows)
Vous devriez commencer par la page Wikipédia . Il possède un tableau de taille décente ( Comparaison des limitations de nom de fichier ), répertoriant les caractères réservés pour de nombreux systèmes de fichiers.
Il contient également une pléthore () d'autres informations sur chaque système de fichiers, y compris des 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 était suspendu.
Il s'avère que les extensions DOS ignorées des périphériques sont telles que con.h
était exactement la même chose que con
, la console d’entrée (ce qui signifie bien sûr que le compilateur m’attendait pour taper le fichier d’en-tête avant de continuer).
Bon, alors regardez Comparaison des systèmes de fichiers si vous ne vous souciez que des systèmes de fichiers du lecteur principal:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
:
ou /
NUL
ou /
donc n'importe quel octet sauf NUL
, \
, /
, :
, *
, "
, <
, >
, |
et vous ne pouvez pas appeler de fichiers/dossiers .
ou ..
et pas de caractères de contrôle (bien sûr).
Pour être plus précis à propos de Mac OS X (maintenant appelé MacOS) /
dans le Finder est interprété comme :
dans le système de fichiers Unix.
Cela a été fait pour la compatibilité ascendante lorsque Apple a quitté Classique Mac OS.
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ît avec un :
.
Et ça marche aussi dans l'autre sens: vous ne pouvez pas utiliser un /
dans un nom de fichier avec le terminal, mais un :
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 assurer la compatibilité des noms entre plates-formes.
Pour les noms de fichier "English locale", cela fonctionne bien. J'utilise ceci pour assainir les noms de fichiers téléchargés. Le nom de fichier n'est pas destiné à être lié à quoi que ce soit sur le disque, il est destiné au téléchargement du fichier, il n'y a donc pas de vérification du chemin d'accès.
$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 les 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.