51 votes

Java - Comment savoir si un nom de fichier est valide?

Dans mon application Java je suis renommer des fichiers à un nom de fichier fourni en paramètre de la Chaîne. Il existe une méthode

boolean OKtoRename(String oldName, String newName)

qui, fondamentalement, vérifie si le newName n'est pas déjà pris par un autre fichier, que je ne veux pas enterrer existants.

Maintenant il m'est apparu que peut-être la newName Chaîne ne sera pas indiquer un nom de fichier valide. J'ai donc pensé à ajouter cette case à la méthode:

if (new File(newName).isFile()) { 
    return false; 
}

Ce qui évidemment n'est pas la bonne façon de le faire, puisque dans la plupart des cas, la newFile n'existe pas encore et donc bien qu'il est OKtoRename, la fonction renvoie la valeur false.

Je me demandais, est-il une méthode (je sais il n'y a pas pour le java.io.Les objets de fichier) comme canExist()? Ou aurais-je avoir recours à des regex pour assurez-vous que le newFile Chaîne ne contient pas de caractères non valides (par exemple,?, *, ", :)? Je me demande si il n'y a peut-être une fonction cachée quelque part dans le JDK qui pourraient me dire si la chaîne peut éventuellement indiquer un nom de fichier valide.

59voto

Zsolt Török Points 3148

J'ai assemblé une liste illégale de caractères de nom de fichier (en tenant compte UNIX, Mac OS X et Windows) pour les systèmes basés sur la recherche en ligne il y a quelques mois. Si le nouveau nom de fichier contient l'un de ces, il y a un risque qu'il pourrait ne pas être valable sur toutes les plates-formes.

private static final char[] ILLEGAL_CHARACTERS = { '/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':' };

EDIT: Je tiens à souligner, que ce n'est pas une solution complète: comme un intervenant l'a souligné, même si il passe ce test de votre nom de fichier peut encore être un Windows mot clé spécifique comme COM, PRN, etc. Toutefois, si votre nom de fichier contient l'un de ces caractères, il sera certainement causer des problèmes dans une croix-plate-forme de l'environnement.

24voto

erickson Points 127945

Utiliser createNewFile(), ce qui va automatiquement créer le fichier seulement si il n'existe pas encore.

Si le fichier est créé, le nom est valide et il n'est pas casser un fichier existant. Vous pouvez ouvrir les fichiers et efficace de copier les données de l'un à l'autre avec FileChannel.transferXXX des opérations.

Une chose importante à garder à l'esprit que, en général, la vérification et la création doit être atomique. Si vous vérifiez d'abord si une opération est sûr, puis effectuer l'opération comme une étape distincte, les conditions ont changé dans le temps, ce qui rend l'opération dangereuse.

Supplémentaire de nourriture pour la pensée, est disponible à cette related post: "Déplacer/Copier des opérations en Java."

19voto

Maxim Mazin Points 824

Ici , une manière spécifique au système est suggérée.

 public static boolean isFilenameValid(String file) {
  File f = new File(file);
  try {
    f.getCanonicalPath();
    return true;
  } catch (IOException e) {
    return false;
  }
}
 

4voto

Mosty Mostacho Points 22803

Voici comment j'ai implémenté ceci:

 public boolean isValidFileName(final String aFileName) {
    final File aFile = new File(aFileName);
    boolean isValid = true;
    try {
        if (aFile.createNewFile()) {
            aFile.delete();
        }
    } catch (IOException e) {
        isValid = false;
    }
    return isValid;
}
 

3voto

svachon Points 2688

Pour moi, cela semble être un problème dépendant du système d'exploitation. Vous voudrez peut-être simplement rechercher un caractère non valide dans le nom du fichier. Lorsque Windows tente de renommer le fichier, un message indiquant qu'un fichier ne peut contenir aucun des caractères suivants apparaît: \ /: *? <> | Je ne suis pas sûr que votre question soit "Y a-t-il une bibliothèque qui fait le travail pour moi?" dans ce cas, je n'en connais aucun.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X