2010-06-05 5 views
7

Lorsque je passe File file à une méthode j'essaie d'obtenir son chemin complet comme file.getAbsolutePath(); Je reçois toujours le même résultat, peu importe lequel j'utilise soit le chemin absolu ou canonique PATH_TO_MY_WORKSPACE/projectName/filename et il n'y est pas , comment puis-je obtenir l'emplacement exact du fichier?Obtenir le chemin complet du fichier en java

Merci

DÉTAILS:

Voici un code et cette solution (son mauvais mais son travail):

private static void doSomethingToDirectory(File factDir) throws IOException { 
      File[] dirContents = factDir.listFiles(); 

      if(factDir.isDirectory() && dirContents.length > 0){ 
       for (int i = 0; i < dirContents.length; i++) { 
        for (String str : dirContents[i].list()) { 
         if(str.equals(TEMP_COMPARE_FILE)){ 
          process(new File(dirContents[i].getAbsolutePath() + "\\" + str)); 
         } 
        } 
       }   
      } 
     } 

Je Looping les répertoires de creux où factDir est src/main , Je cherche des fichiers BEProcessed.txt seulement qui est la valeur TEMP_COMPARE_FILE et je les envoie à la méthode de traitement qui lit le fichier et le traite.

Si quelqu'un pouvait meilleure solution, je serais reconnaissant

+1

êtes-vous sûr que ce n'est pas là? avez-vous actualiser l'arborescence de fichiers? (si vous utilisez eclipse;)) – RoflcoptrException

+0

Comment avez-vous créé cet objet fichier? –

+0

@Sebi que je l'ai fait, @Peter oui je l'ai fait :) – ant

Répondre

13

Cette citation du Javadoc pourrait être utile:

Un chemin, que ce soit abstraite ou sous forme de chaîne, peut être soit absolue ou relatif. Un chemin d'accès absolu est complet car aucune autre information n'est requise pour localiser le fichier qu'il dénote. Un chemin relatif, en revanche, doit être interprété en termes d'informations provenant d'un autre chemin. Par défaut, les classes du package java.io résolvent toujours les chemins d'accès relatifs par rapport au répertoire utilisateur en cours. Ce répertoire est nommé par la propriété système user.dir et est généralement le répertoire dans lequel la machine virtuelle Java a été appelée.

J'interprète cela pour que si vous créez votre objet File avec new File("filename")filename est un chemin relatif, ce chemin ne sera pas transformé en un chemin absolu, même par un appel à file.getAbsolutePath().

Mise à jour: maintenant que vous avez publié le code, je peux penser à des façons de l'améliorer:

  • vous pouvez utiliser un FilenameFilter pour trouver les fichiers désirés,
  • Notez que list et listFiles retour null pour les objets non-annuaire, donc nous avons besoin d'un contrôle supplémentaire pour cela,
  • vous pouvez également utiliser listFiles() à nouveau dans la boucle interne, évitant ainsi la nécessité de créer de nouveaux objets File w ith chemins assemblés à la main. (Notez que l'ajout manuel de \\ au chemin n'est pas portable, la bonne façon serait d'utiliser File.separator).

Le résultat final est

private static void doSomethingToDirectory(File factDir) throws IOException { 
    if (factDir.isDirectory()) { 
    for (File file : factDir.listFiles()) { 
     if (file.isDirectory()) { 
     for (File child : file.listFiles(new MyFilter())) { 
      process(child); 
     } 
     } 
    }   
    } 
} 

class MyFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
    return name.equals(TEMP_COMPARE_FILE); 
    } 
} 

Notez que ce code imite le comportement de votre code original, autant que je l'ai compris; Plus particulièrement, il trouve les fichiers avec le nom propre uniquement dans les sous-répertoires directs de factDir, de manière non récurrente.

+2

w0w Peter Je dois définitivement dire ceci, je pense que c'est l'une des meilleures réponses que j'ai jamais eues sur toi, ta suggestion de classe MyFilter réduite comme autant de code, juste ÉTONNANTE. Merci beaucoup – ant

2

Je pense qu'il existe un moyen de vous aider si et seulement si le fichier se trouve dans le répertoire du programme.

premier vous obtenez le répertoire du programme par:

new File(".").getCanonicalPath() 

alors:

si file est à l'intérieur d'un répertoire spécifique comme folder\\filename le chemin complet sera

(new File(".").getCanonicalPath() + "\\folder\\filename") 

ou si file est directement dans le répertoire du programme: le chemin d'accès complet wi ll être

(new File(".").getCanonicalPath() + "\\filename") 

Je souhaite que cette aide de réponse que vous :)

Questions connexes