Mon programme prendra des chaînes arbitraires d'Internet et les utilisera pour les noms de fichiers. Existe-t-il un moyen simple de supprimer les mauvais caractères de ces chaînes ou dois-je écrire une fonction personnalisée pour cela?
92
Réponses:
Ugh, je déteste quand les gens essaient de deviner quels caractères sont valides. En plus d'être complètement non portables (en pensant toujours à Mono), les deux commentaires précédents ont manqué plus de 25 caractères invalides.
la source
Pour supprimer les caractères non valides:
Pour remplacer des caractères non valides:
Pour remplacer les caractères invalides (et éviter les conflits de noms potentiels comme Hell * vs Hell $):
la source
Cette question a été posée plusieurs fois auparavant et, comme cela a déjà été souligné à maintes reprises,
IO.Path.GetInvalidFileNameChars
ne suffit pas.Premièrement, il existe de nombreux noms comme PRN et CON qui sont réservés et non autorisés pour les noms de fichiers. Il existe d'autres noms non autorisés uniquement dans le dossier racine. Les noms qui se terminent par un point ne sont pas non plus autorisés.
Deuxièmement, il existe diverses limitations de longueur. Lisez la liste complète pour NTFS ici .
Troisièmement, vous pouvez vous attacher à des systèmes de fichiers qui ont d'autres limitations. Par exemple, les noms de fichiers ISO 9660 ne peuvent pas commencer par "-" mais peuvent le contenir.
Quatrièmement, que faites-vous si deux processus choisissent «arbitrairement» le même nom?
En général, l'utilisation de noms générés en externe pour les noms de fichiers est une mauvaise idée. Je suggère de générer vos propres noms de fichiers privés et de stocker des noms lisibles par l'homme en interne.
la source
Je suis d'accord avec Grauenwolf et je recommande vivement le
Path.GetInvalidFileNameChars()
Voici ma contribution C #:
ps - c'est plus cryptique qu'il ne devrait l'être - j'essayais d'être concis.
la source
Array.ForEach
foreach
Path.GetInvalidFileNameChars().Aggregate(file, (current, c) => current.Replace(c, '-'))
Voici ma version:
Je ne sais pas comment le résultat de GetInvalidFileNameChars est calculé, mais le "Get" suggère qu'il n'est pas trivial, donc je cache les résultats. En outre, cela ne parcourt la chaîne d'entrée qu'une seule fois au lieu de plusieurs fois, comme les solutions ci-dessus qui itèrent sur l'ensemble des caractères non valides, en les remplaçant dans la chaîne source un par un. Aussi, j'aime les solutions basées sur Where, mais je préfère remplacer les caractères invalides au lieu de les supprimer. Enfin, mon remplacement est exactement un caractère pour éviter de convertir des caractères en chaînes lorsque j'itère sur la chaîne.
Je dis tout cela sans faire le profilage - celui-ci "me sentait" juste. :)
la source
new HashSet<char>(Path.GetInvalidFileNameChars())
éviter l'énumération O (n) - micro-optimisation.Voici la fonction que j'utilise maintenant (merci jcollum pour l'exemple C #):
Je viens de mettre cela dans une classe "Helpers" pour plus de commodité.
la source
Si vous souhaitez supprimer rapidement tous les caractères spéciaux, ce qui est parfois plus lisible par l'utilisateur pour les noms de fichiers, cela fonctionne bien:
la source
\W
correspond en fait à plus que les non-alphanumériques ([^A-Za-z0-9_]
). Tous les caractères Unicode 'mot' (русский 中文 ..., etc.) ne seront pas non plus remplacés. Mais c'est une bonne chose..
, vous devez d'abord extraire l'extension, puis l'ajouter à nouveau après.la source
Pourquoi ne pas convertir la chaîne en un équivalent Base64 comme ceci:
Si vous souhaitez le reconvertir pour pouvoir le lire:
Je l'ai utilisé pour enregistrer des fichiers PNG avec un nom unique à partir d'une description aléatoire.
la source
Voici ce que je viens d'ajouter à la classe statique StringExtensions de ClipFlair ( http://github.com/Zoomicon/ClipFlair ) (projet Utils.Silverlight), sur la base des informations recueillies à partir des liens vers les questions liées au stackoverflow publiées par Dour High Arch ci-dessus:
la source
la source
Je trouve que l'utilisation de ceci est rapide et facile à comprendre:
Cela fonctionne car a
string
est enIEnumerable
tant quechar
tableau et qu'il existe unestring
chaîne de constructeur qui prend unchar
tableau.la source
De mes projets plus anciens, j'ai trouvé cette solution qui fonctionne parfaitement depuis 2 ans. Je remplace les caractères illégaux par "!", Puis vérifie les doubles !!, utilise votre propre caractère.
la source
Beaucoup de réponses suggèrent d'utiliser
Path.GetInvalidFileNameChars()
ce qui me semble être une mauvaise solution. Je vous encourage à utiliser la liste blanche au lieu de la liste noire, car les pirates trouveront toujours un moyen de la contourner.Voici un exemple de code que vous pourriez utiliser:
la source