Comment éviter exception FileNotFound lors de l'exécution Java sur Linux en raison de cas de sensibilité?

StackOverflow https://stackoverflow.com/questions/1733770

Question

Mon application web fonctionne sous Windows. Je voudrais lancer mon application sur Linux aussi. Il me semble avoir surmonté la plupart des problèmes tels que le séparateur de chemin, etc.

vrai problème est maintenant je FileNotFoundException lorsque le code Java tente d'ouvrir un fichier dire Abc.txt quand existe seulement abc.txt. : (

Je ne peux pas continuer à changer tous les noms de fichiers en minuscules ou en majuscules que j'ai beaucoup de fichiers. Sans changement de code est beaucoup plus que tous les moyens possibles pour éviter cela?

Était-ce utile?

La solution

Il n'y a aucun moyen d'éviter ce que l'API java.io.File dépend du système. Vous devez utiliser le bon cas lors de la manipulation des fichiers sous Linux / Unix. En fait, mon conseil / solution serait de suivre les conventions strictes et portables au cours du développement sous Windows (par exemple utiliser les minuscules ou les noms de fichiers uniquement, mieux, utiliser le nom exact du fichier lors de l'accès par programme ). Pour être honnête, je ne comprends pas pourquoi vous essayez de charger Abc.txt lorsque le nom de fichier est abc.txt. Ceci est une mauvaise habitude (enseigné par passer trop de temps sur Windows) plutôt que d'un problème Linux / Unix.

Autres conseils

Fix it!

Tout système méditez pour contourner le fixer sera pire à long terme.

Eh bien, tout d'abord je pense que vous devrait envisager de passer à un schéma de nommage cohérent, plutôt que d'utiliser une solution de contournement.

Quoi qu'il en soit, qu'en est lire dans tous les noms de fichiers et de les mettre dans une carte qui contient le nom minuscule comme une clé? Vous pouvez ensuite rechercher le nom de fichier correct de la carte .

Cela vous permettra également de détecter un conflit, par exemple deux fichiers « fichierA.txt » et « fichierA.txt » dans le même répertoire qui ont les mêmes représentations minuscules, dans ce cas, vous savez que vous devez aborder le problème d'une manière complètement différente (parce que vous devez savoir qui celui que vous voulez avoir ouvert, et il est ambigu, et une telle solution de contournement ne sera pas le faire alors).

En supposant que les fichiers sont mélangés cas sous Linux, il n'y a pas de réponse simple à cette question.

Le mieux que je peux penser est d'avoir votre liste des applications les répertoires concernés et créer une structure de données de la mémoire des noms de fichiers Linux réels. Ensuite, faire un fichier insensible à la casse ouverte, vous divisez le chemin en composants, recherchez le en mémoire arbre en utilisant la recherche insensible à la casse, bulid le chemin réel (sensible à la casse) et l'utiliser pour faire le fichier ouvert.

Le problème est qu'il (et même votre application) ne peut pas faire face au cas où vous avez (par exemple) « foo.txt » ET « toto.txt » dans le même répertoire Linux.

Mais la meilleure solution est de changer votre application pour qu'elle fonctionne avec des noms de fichiers sensibles à la casse.

Pourquoi ne pouvez-vous changer beaucoup de fichiers? Si la quantité de fichiers est vraiment la seule chose qui vous retient, puis il suffit d'écrire un petit script qui les renomme tous les minuscules.

Il est pas clair de votre question ce qui est à l'origine du changement de cas de vos fichiers. Si tous vos fichiers sont en minuscules dans linux, alors qu'ils sont mélangés cas sur les fenêtres, vous pouvez simplement transformer le nom de fichier en minuscules, comme suit:

new File(filename.toLowerCase())

Il y a une solution qui a des performances horribles d'exécution, mais est très simple à mettre en œuvre:

Remplacer new FileReader(name) avec quelque chose comme

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

Je n'ai pas compilé ce code, il peut avoir des fautes de frappe et les insectes. Je les laisse à vous fixer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top