Est-il une croix-plate-forme Java de la méthode pour supprimer le nom de fichier caractères spéciaux?
Je suis en train de faire une application multiplate-forme qui renomme les fichiers en fonction des données récupérées en ligne. Je tiens à désinfecter les Cordes j'ai pris à partir d'une API web pour la plate-forme actuelle.
Je sais que les différentes plates-formes ont différentes de nom de fichier exigences, donc je me demandais si il y a une croix-plate-forme de façon de le faire?
Edit: Sur les plates-formes Windows, vous ne pouvez pas avoir un point d'interrogation"? " dans un nom de fichier, alors que sous Linux, vous pouvez. Les noms de fichier peuvent contenir de tels personnages et j'aimerais que les plates-formes qui prennent en charge ces caractères pour les garder, mais sinon, bande de sortir.
Aussi, je préfère un standard de Java solution qui ne nécessite pas de bibliothèques tierces.
- Ben, pourriez-vous donner quelques exemples?
- Ajoutée le point d'interrogation commentaires à ma question.
Vous devez vous connecter pour publier un commentaire.
Comme le suggère d'ailleurs, ce n'est généralement pas ce que vous voulez faire. Il est généralement préférable de créer un fichier temporaire à l'aide d'une méthode sécurisée de Fichiers.createTempFile().
Vous ne devriez pas le faire avec une liste blanche et de ne garder que les "bonnes" des personnages. Si le fichier ne contient que des caractères Chinois, alors vous dépouiller de tout, hors de lui. Nous ne pouvons pas utiliser une liste blanche pour cette raison, nous devons utiliser une liste noire.
Linux assez bien permet de tout ce qui peut être une vraie douleur. Je voudrais juste limite Linux à la même liste que vous limiter à Windows de sorte que vous enregistrez vous-même des maux de tête à l'avenir.
À l'aide de ce C# extrait sur Windows, j'ai produit une liste de caractères qui ne sont pas valides sur Windows. Il ya tout à fait quelques personnages de plus dans cette liste que vous pouvez penser (41), de sorte que je ne recommande pas d'essayer de créer votre propre liste.
Ici est une simple classe Java qui "nettoie" un nom de fichier.
EDIT:
Comme Stephen suggéré probablement vous devriez également vérifier que ces fichiers ne peut accéder qu'à se produire dans le répertoire de vous permettre.
La réponse suivante contient des exemples de code pour la création d'un custom contexte de sécurité en Java et donc l'exécution de code dans 'bac à sable'.
Comment voulez-vous créer une sécurité JEXL (script) sandbox?
binarySearch
pour fonctionner correctement. S'il vous plaît ajouterArrays.sort(illegalChars)
ou de modifier le tableau "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 42, 47, 58, 60, 62, 63, 92, 124}"charAt()
... en fait, vous ne devriez jamais utilisercharAt
. Le considérer comme obsolète. La raison est quecharAt
ne peut pas traiter avec des points de code Unicode en dehors de la Plan Multilingue de Base comme c'est une valeur de 16 bits. Au lieu de cela, utiliser les codePointAt() qui renvoie un entier. En outre, cela supprime la nécessité pour le cast en int que vous êtes en train de faire.length()
renvoie le nombre de caractères, donc si vous utilisezcodePointAt
vous devez utiliser codePointCount():badFileName.codePointCount(0, badFileName.length());
ou tout simplement faire ceci:
Résultat:
A20_B22b_A_BC_ld_ma.la.xps
Explication:
[a-zA-Z0-9\\._]
correspond à une lettre de a à z, en minuscules ou en majuscules, des nombres, des points et des traits de soulignement[^a-zA-Z0-9\\._]
est l'inverse. c'est à dire tous les caractères qui ne correspondent pas à la première expression[^a-zA-Z0-9\\._]+
est une séquence de caractères qui ne correspondent pas à la première expressionDe sorte que chaque séquence de caractères qui ne sont pas constitués de caractères a-z, 0-9 ou . _ va être remplacé.
String sane = filename.replaceAll("(?U)[^\\w\\._]+", "_") ;
Ceci est basé sur la accepté de répondre par Sarel Botha qui fonctionne très bien tant que vous ne rencontrerez pas de tous les caractères en dehors de la Plan Multilingue De Base. Si vous avez besoin de support complet Unicode (et qui ne l'est pas?) utilisez ce code à la place qui est Unicode sûre:
Principaux changements ici:
length
au lieu de simplementlength
charAt
append
char
s àint
s. En fait, vous ne devriez jamais traiter avecchar
s comme ils sont fondamentalement brisé pour quoi que ce soit à l'extérieur de la BMP.Il est très bien intégré dans la solution Java - Caractère.isXxx().
Essayer
Character.isJavaIdentifierPart(c)
:Résultat est "nom.é$_".
Voici le code que j'utilise:
SystemUtils
est de Apache commons-lang3Il n'est pas clair à partir de votre question, mais puisque vous êtes planification à accepter des chemins d'accès à partir d'un formulaire web (?) vous avez probablement devrait bloquer les tentatives de renommer certaines choses; par exemple, "C:\Program les Fichiers". Cela implique que vous devez accepter les chemins d'accès afin d'éliminer les "." et ".." avant de faire vos contrôles d'accès.
Étant donné que, je ne voudrais pas essayer d'enlever des caractères illégaux. Au lieu de cela, j'utiliserais "nouveau Fichier(str).getCanonicalFile()" afin de produire de l'canonique chemins, à côté de vérifier qu'ils remplissent votre bac à sable restrictions, et enfin l'utilisation de Fichiers".exists()", "Fichier.isFile()", etc pour vérifier que la source et la destination sont casher, et ne sont pas le même système de fichier de l'objet. Je préfère traiter avec des caractères illégaux en essayant de faire les opérations et attraper les exceptions.
Paths.get(...)
jette détaillée exception à la position du caractère illégal.Si vous souhaitez utiliser plus de comme [A-Za-z0-9], puis vérifiez MS Conventions de Nommage, et n'oubliez pas de filtrer "...des Personnages dont l'entier des représentations sont dans la plage de 1 à 31,...", comme dans l'exemple de Aaron Digulla n'. Le code par exemple de David Carboni ne serait pas suffisant pour ces caractères.
Extrait contenant la liste des caractères réservés: