Fichiers insensibles à la casse.est égale à la casse du système de fichiers
J'ai un chemin d'accès au fichier dans la forme d'une Chaîne. En Java, j'ai besoin de déterminer si un fichier existe sur le système de fichiers (et notre code doit être multi-plateforme, car il fonctionne sur Windows, Linux et OS X).
Le problème est que le cas du fichier chemin d'accès et le fichier lui-même peut ne pas correspondre, même si elles représentent le même fichier (sans doute c'est parce qu'ils sont originaires de Windows et l'écart n'a pas été remarqué).
Par exemple, j'ai un chemin de fichier "ABC.txt". Un fichier appelé "abc.txt" existe sur le système de fichiers. Le code suivant sera de retour vrai sur Windows mais faux sur Linux:
new File("ABC.txt").exists();
Quelle est la meilleure façon de déterminer si le fichier existe, et si elle existe pour le retour d'un handle du fichier sur le système de fichiers?
OriginalL'auteur jwaddell | 2009-08-19
Vous devez vous connecter pour publier un commentaire.
Obtenir la liste des fichiers du répertoire (
Fichier.liste()
) et comparer les noms à l'aide deequalsIgnoreCase()
.je ne pense pas qu'il y est une meilleure solution, car le nom de fichier/chemin d'accès peut être dans n'importe quel boîtier et le système d'exploitation linux traite dans un cas sensible à la mode.
On dirait que je vais à contrecœur mettre en œuvre cette solution, en plus de récursive chemin de la vérification.
OriginalL'auteur Shimi Bandiel
Cette méthode va vous dire si un fichier du même nom en question (la partie du chemin d'accès n'est pas sensible à la casse).
+1 Pas exactement la réponse à la question le sujet, mais m'a aidé à réaliser la casse vérifier sur Windows.
OriginalL'auteur Lenny T
Comme jwaddell dit, il semble que la TRÈS LENTE récursive chemin de vérification de l'est (apparemment) la seule façon de le faire. Voici ma fonction écrite en java qui accepte une Chaîne de caractères qui est un chemin d'accès. Si la chaîne représentant le chemin d'accès du fichier existe et est identique à la casse de celui rapporté par windows, puis elle retourne true, sinon false.
OriginalL'auteur Eric Leschinski
Si les écarts sont aléatoires, puis pour moi Shimi la solution récursive segment de chemin de vérification est la meilleure solution. Il semble laid au premier coup d'oeil, mais vous pouvez masquer la magie dans une catégorie distincte et de mettre en œuvre une API simple pour retourner le descripteur de fichier pour un nom de fichier, il vous suffit de voir quelque chose comme un
Translator.translate(file)
appel.Peut-être, les écarts sont un peu statiques, prévisible. Alors je préfère un dictionnaire qui peut être utilisée pour traduire un nom de fichier pour Windows/Linux, les noms de fichier. Sur le gros avantage par rapport à l'autre méthode: le risque de tomber sur un mauvais descripteur de fichier est plus petit.
Si le dictionnaire a été vraiment statique, vous pouvez créer et maintenir un fichier de propriétés. Si elle est statique, mais plus complexe, de dire un nom de fichier peut être traduit à plus d'une cible possible les noms de fichier, je serais de retour le dictonary classe avec un
Map<String, Set<String>>
discbased (Set
préféré surList
car il n'y a pas dupliquer suppléants).OriginalL'auteur Andreas_D
Voici mon Java 7 solution, pour les situations où un parent chemin est connu et l'un par rapport à l'enfant le chemin d'accès peuvent avoir différents cas pour le chemin d'accès sur le disque.
Par exemple, le fichier
/tmp/foo/biscuits
, la méthode renvoie correctement unPath
pour le fichier de la manière suivante:/tmp
etfoo/biscuits
/tmp
etfoo/BISCUITS
/tmp
etFOO/BISCUITS
/tmp
etFOO/biscuits
Noter que cette solution a pas été robuste testé et doit donc être considéré comme un point de départ plutôt qu'un prêt à la production de l'extrait de code.
OriginalL'auteur nullPainter
Comme pour la première partie de la question: l'utilisation Chemin d'accès.toRealPath. Il ne traite pas uniquement de la casse, mais aussi les liens symboliques (selon les options que vous donnez en tant que paramètres), etc. Cela nécessite Java 7 ou au-dessus.
Comme pour la deuxième partie de la question: vous ne savez pas ce que vous voulez dire avec "poignée".
Bon pour Windows, mais toujours pas sur Linux.
OriginalL'auteur Dennis Hendriks
Vous pouvez faire ce que vous cherchez avec ce code.
Depuis l'Canonique de nom de Fichier renvoie le nom du fichier, sensible à la casse, si vous obtenez quelque chose de pas égal à égal, le fichier existe avec le même nom mais un cas différent.
Sur Windows, si le fichier existe, avec tous les cas, il retournera true. Si le fichier n'existe pas, le nom canonique sera la même, de sorte qu'il sera de retour faux.
Sur Linux, si le fichier existe avec un autre cas, il sera de retour ce nom différent, et la méthode renvoie true. Si il existe avec la même affaire, le premier test renvoie la valeur true.
Dans les deux cas, si le fichier n'existe pas et le nom et le nom canonique sont les mêmes, le fichier n'existe pas.
OriginalL'auteur Julien Feniou