Je sais que / est illégal sous Linux, et ce qui suit est illégal sous Windows (je pense) *
.
"
/
\
[
]
:
;
|
,
Que manque-t-il d'autre?
J'ai besoin d'un guide complet, cependant, et qui prend en compte les caractères codés sur deux octets. Le lien avec des ressources extérieures me convient.
Je dois d'abord créer un répertoire sur le système de fichiers en utilisant un nom qui peut contenir des caractères interdits, je prévois donc de remplacer ces caractères par des traits de soulignement. J'ai ensuite besoin d'écrire ce répertoire et son contenu dans un fichier zip (en utilisant Java), donc tout conseil supplémentaire concernant les noms des répertoires zip serait apprécié.
echo abc > "ab.;,=[1]"
Réponses:
Un «guide complet» des caractères de noms de fichiers interdits ne fonctionnera pas sous Windows car il réserve les noms de fichiers ainsi que les caractères. Oui, les caractères comme
*
"
?
et autres sont interdits, mais il existe un nombre infini de noms composés uniquement de caractères valides qui sont interdits. Par exemple, les espaces et les points sont des caractères de nom de fichier valides, mais les noms composés uniquement de ces caractères sont interdits.Windows ne fait pas de distinction entre les majuscules et les minuscules, vous ne pouvez donc pas créer un dossier nommé
A
s'il ena
existe déjà un. Pire, les noms apparemment autorisés commePRN
etCON
, et bien d'autres, sont réservés et non autorisés. Windows a également plusieurs restrictions de longueur; un nom de fichier valide dans un dossier peut devenir invalide s'il est déplacé vers un autre dossier. Les règles de dénomination des fichiers et des dossiers se trouvent sur les documents Microsoft.Vous ne pouvez pas, en général, utiliser du texte généré par l'utilisateur pour créer des noms de répertoire Windows. Si vous souhaitez autoriser les utilisateurs à quoi que ce soit le nom qu'ils veulent, vous devez créer des noms sûrs comme
A
,AB
,A2
et al., Stocker des noms générés par les utilisateurs et leurs équivalents de chemin dans un fichier de données d'application, et effectuer la cartographie de chemin dans votre application.Si vous devez absolument autoriser les noms de dossiers générés par l'utilisateur, la seule façon de savoir s'ils ne sont pas valides consiste à intercepter les exceptions et à supposer que le nom n'est pas valide. Même cela est lourd de dangers, car les exceptions levées pour l'accès refusé, les lecteurs hors ligne et l'espace disque manquent avec celles qui peuvent être levées pour des noms non valides. Vous ouvrez une énorme boîte de mal.
la source
A.txt
n'est pas valide cara.TXT
peut exister.COPY CON PRN
signifie lire à partir du clavier, ou d'un éventuel stdin, et le copier sur le périphérique d'impression. Pas sûr qu'il soit toujours valable sur les fenêtres modernes, mais il l'était certainement depuis longtemps. Dans l'ancien temps, vous pouviez l'utiliser pour taper du texte et avoir une imprimante matricielle simplement en sortie.Restons simples et répondons d'abord à la question.
Les caractères ASCII imprimables interdits sont:
Linux / Unix:
Les fenêtres:
Caractères non imprimables
Si vos données proviennent d'une source qui autoriserait les caractères non imprimables, il y a plus à vérifier.
Linux / Unix:
Les fenêtres:
Remarque: Bien qu'il soit légal sous les systèmes de fichiers Linux / Unix de créer des fichiers avec des caractères de contrôle dans le nom de fichier, cela peut être un cauchemar pour les utilisateurs de traiter ces fichiers .
Noms de fichiers réservés
Les noms de fichiers suivants sont réservés:
Les fenêtres:
(à la fois seuls et avec des extensions de fichiers arbitraires, par exemple
LPT1.txt
).Autres règles
Les fenêtres:
Les noms de fichiers ne peuvent pas se terminer par un espace ou un point.
la source
Sous Linux et d'autres systèmes liés à Unix, il n'y a que deux caractères qui ne peuvent pas apparaître dans le nom d'un fichier ou d'un répertoire, ce sont NUL
'\0'
et slash'/'
. La barre oblique, bien sûr, peut apparaître dans un nom de chemin, séparant les composants du répertoire.Selon la rumeur 1, Steven Bourne (de renommée `` shell '') avait un répertoire contenant 254 fichiers, un pour chaque lettre (code de caractère) qui peut apparaître dans un nom de fichier (à l'exclusion de
/
,'\0'
le nom.
était le répertoire actuel, bien sûr ). Il a été utilisé pour tester le shell Bourne et faire des ravages routiniers sur des programmes imprudents tels que des programmes de sauvegarde.D'autres personnes ont couvert les règles de Windows.
Notez que MacOS X possède un système de fichiers insensible à la casse.
1 C'est Kernighan & Pike dans The Practice of Programming qui l'a dit au chapitre 6, Testing, §6.5 Stress Tests:
Notez que le répertoire doit avoir contenu des entrées
.
et..
, par conséquent, il s'agissait sans doute de 253 fichiers (et de 2 répertoires), ou 255 entrées de nom, plutôt que de 254 fichiers. Cela n'affecte pas l'efficacité de l'anecdote, ni les tests minutieux qu'elle décrit.la source
/
dans le nom. Cela a causé quelques problèmes, car il a créé un nouveau répertoire avec le schéma.PATH
variable Unix car deux-points sont utilisés comme séparateur (point-virgule sous Windows). Ainsi, les programmes dans un tel répertoire doivent être exécutés avec un chemin qui spécifie où il se trouve (peut être relatif ou absolu), ou vous devez être dans le répertoire et avoir un point (.
, le répertoire courant) dansPATH
, qui est largement considéré comme un dangereux.Au lieu de créer une liste noire de personnages, vous pouvez utiliser une liste blanche . Tout bien considéré, la plage de caractères qui a du sens dans un contexte de nom de fichier ou de répertoire est assez courte, et à moins que vous n'ayez des exigences de dénomination très spécifiques, vos utilisateurs ne le retiendront pas contre votre application s'ils ne peuvent pas utiliser la table ASCII entière.
Cela ne résout pas le problème des noms réservés dans le système de fichiers cible, mais avec une liste blanche, il est plus facile d'atténuer les risques à la source.
Dans cet esprit, il s'agit d'une gamme de personnages qui peuvent être considérés comme sûrs:
Et tous les caractères de sécurité supplémentaires que vous souhaitez autoriser. Au-delà de cela, il vous suffit d'appliquer certaines règles supplémentaires concernant les espaces et les points . Cela suffit généralement:
Cela permet déjà des noms assez complexes et absurdes. Par exemple, ces noms seraient possibles avec ces règles et seraient des noms de fichiers valides sous Windows / Linux:
A...........ext
B -.- .ext
En substance, même avec si peu de caractères sur la liste blanche, vous devez toujours décider de ce qui a du sens et valider / ajuster le nom en conséquence. Dans l'une de mes applications, j'ai utilisé les mêmes règles que ci-dessus, mais j'ai supprimé les points et les espaces en double.
la source
Le moyen le plus simple pour que Windows vous dise la réponse est d'essayer de renommer un fichier via l'Explorateur et de taper / pour le nouveau nom. Windows affichera une boîte de message vous indiquant la liste des caractères illégaux.
https://support.microsoft.com/en-us/kb/177506
la source
Eh bien, ne serait-ce qu'à des fins de recherche, alors votre meilleur pari est de regarder cette entrée Wikipedia sur les noms de fichiers .
Si vous souhaitez écrire une fonction portable pour valider l'entrée utilisateur et créer des noms de fichiers en fonction de cela, la réponse courte est non . Jetez un oeil à un module portable comme File :: Spec de Perl pour avoir un aperçu de tous les sauts nécessaires pour accomplir une tâche aussi "simple".
la source
Pour Windows, vous pouvez le vérifier à l'aide de PowerShell
Pour afficher les codes UTF-8, vous pouvez convertir
la source
Dans Windows 10 (2019), les caractères suivants sont interdits par une erreur lorsque vous essayez de les taper:
la source
Voici l'implémentation ac # pour Windows basée sur la réponse de Christopher Oezbek
Il a été rendu plus complexe par le booléen containsFolder, mais nous espérons qu'il couvre tout
la source
StringBuilder
avec la valeur de capacité initiale? 2. Pourquoi avez-vous ajouté 12 à la longueur dufilename
? 3. Est-ce que 12 ont été choisis arbitrairement ou y a-t-il eu une réflexion derrière ce chiffre?Au 18/04/2017, aucune simple liste noire ou blanche de caractères et de noms de fichiers n'apparaissait parmi les réponses à ce sujet - et il existe de nombreuses réponses.
La meilleure suggestion que j'ai pu trouver était de laisser l'utilisateur nommer le fichier comme il l'entend. Utiliser un gestionnaire d'erreurs lorsque l'application essaie d'enregistrer le fichier, intercepter toutes les exceptions, supposer que le nom de fichier est à blâmer (évidemment après s'être assuré que le chemin d'enregistrement était correct également), et demander à l'utilisateur un nouveau nom de fichier. Pour de meilleurs résultats, placez cette procédure de vérification dans une boucle qui se poursuit jusqu'à ce que l'utilisateur réussisse ou abandonne. Fonctionné le mieux pour moi (au moins en VBA).
la source
Bien que les seuls caractères Unix illégaux puissent être
/
etNULL
, bien qu'une certaine considération pour l'interprétation en ligne de commande devrait être incluse.Par exemple, même s'il peut être légal de nommer un fichier
1>&2
ou2>&1
sous Unix, des noms de fichiers comme celui-ci peuvent être mal interprétés lorsqu'ils sont utilisés sur une ligne de commande.De même, il peut être possible de nommer un fichier
$PATH
, mais lorsque vous essayez d'y accéder à partir de la ligne de commande, le shell se traduira$PATH
par sa valeur de variable.la source
$'myvalueis'
, ex:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
« salut »Des difficultés à définir ce qui est légal ou non ont déjà été abordées et des listes blanches ont été suggérées . Mais Windows prend en charge les caractères supérieurs à 8 bits . Wikipédia déclare que (par exemple) le
Par conséquent, je veux présenter une approche beaucoup plus libérale utilisant des caractères Unicode pour remplacer ceux "illégaux". J'ai trouvé le résultat dans mon cas d'utilisation comparable beaucoup plus lisible. Regardez par exemple dans ce bloc . De plus, vous pouvez même restaurer le contenu d'origine à partir de cela. Les choix et recherches possibles sont fournis dans la liste suivante:
U+002A * ASTERISK
), vous pouvez utiliser l' un des nombreux répertoriés, par exempleU+2217 ∗ (ASTERISK OPERATOR)
ouFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(Alternatives voir ici )/ SOLIDUS U+002F
), vous pouvez utiliser∕ DIVISION SLASH U+2215
(d'autres ici )\ U+005C Reverse solidus
), vous pouvez utiliser⧵ U+29F5 Reverse solidus operator
( plus )U+005B Left square bracket
) et ](U+005D Right square bracket
), vous pouvez utiliser par exempleU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
etU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
(à partir d' ici , plus de possibilités ici )U+2236 ∶ RATIO (for mathematical usage)
ouU+A789 ꞉ MODIFIER LETTER COLON
, (voir deux - points (lettre) , parfois utilisé dans les noms de fichiers Windows car il est identique au deux-points dans la police d' interface utilisateur Segoe utilisée pour les noms de fichiers. Le deux-points lui-même n'est pas autorisé) (voir ici )U+037E ; GREEK QUESTION MARK
(voir ici )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
ouU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Les personnages de dessin de boîte contiennent également diverses autres options., U+002C COMMA
), vous pouvez utiliser par exemple‚ U+201A SINGLE LOW-9 QUOTATION MARK
(voir ici )U+003F ? QUESTION MARK
), ce sont de bons candidats:U+FF1F ? FULLWIDTH QUESTION MARK
ouU+FE56 ﹖ SMALL QUESTION MARK
(de lui re , deux autres de Symboles Bloc , recherchez « question »)la source
Lors de la création de raccourcis Internet dans Windows, pour créer le nom de fichier, il ignore les caractères illégaux, à l'exception de la barre oblique, qui est convertie en moins.
la source
Dans les shells Unix, vous pouvez citer presque tous les caractères entre guillemets simples
'
. Excepté le guillemet simple lui-même, et vous ne pouvez pas exprimer de caractères de contrôle, car il\
n'est pas développé. L'accès au guillemet simple lui-même à partir d'une chaîne entre guillemets est possible, car vous pouvez concaténer des chaînes avec des guillemets simples et doubles, comme ceux'I'"'"'m'
qui peuvent être utilisés pour accéder à un fichier appelé"I'm"
(les guillemets doubles sont également possibles ici).Vous devez donc éviter tous les caractères de contrôle, car ils sont trop difficiles à saisir dans le shell. Le reste est toujours drôle, en particulier les fichiers commençant par un tiret, car la plupart des commandes les lisent comme des options, sauf si vous avez deux tirets
--
avant ou si vous les spécifiez avec./
, ce qui masque également le début-
.Si vous voulez être gentil, n'utilisez aucun des caractères que le shell et les commandes typiques utilisent comme éléments syntaxiques, parfois dépendant de la position, donc par exemple vous pouvez toujours utiliser
-
, mais pas comme premier caractère; de même avec.
, vous ne pouvez l'utiliser comme premier caractère que lorsque vous le pensez ("fichier caché"). Quand vous êtes méchant, vos noms de fichiers sont des séquences d'échappement VT100 ;-), de sorte qu'un ls brouille la sortie.la source
J'avais le même besoin et recherchais des recommandations ou des références standard et suis tombé sur ce fil. Ma liste noire actuelle de caractères à éviter dans les noms de fichiers et de répertoires est la suivante:
la source
@
sur la liste?b
? lol, je suppose que c'est le b delank spaces
... eh bien qui en laisse encore quelques-uns ... J'ai renommé une photo(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
mais j'ai dû la changer car elle avait l'air en colère ...