2010-06-05 2 views
7

Когда я передаю File file методу, я пытаюсь получить его полный путь, как file.getAbsolutePath(); Я всегда получаю тот же результат независимо от того, какой из них я использую либо абсолютный, либо канонический путь PATH_TO_MY_WORKSPACE/projectName/filename, и его нет , как я могу получить точное местоположение файла?Получить полный путь к файлу в java

Спасибо

ПОДРОБНОСТИ:

Вот код, и это решение (его плохое, но его работа):

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)); 
         } 
        } 
       }   
      } 
     } 

Я циклическое корыто каталогов, где factDir является src/main , Я ищу файлы toBeProcessed.txt только значение TEMP_COMPARE_FILE, и я отправляю их методу обработки, который читает файл и обрабатывает его.

Если кто-то может лучше решение, которое я бы признательн

+1

вы уверены, что не существует? вы обновили дерево файлов? (если используется eclipse;)) – RoflcoptrException

+0

Как вы создали этот файл? –

+0

@ Sebi уверен, что я сделал, @Peter да я сделал :) – ant

ответ

13

Эта цитата из Javadoc может быть полезным:

Имя пути, будь то абстрактное или в виде строки, может быть либо абсолютным или родственник. Абсолютное имя пути завершено, поскольку никакая другая информация не требуется, чтобы найти файл, который он обозначает. Относительное имя пути, напротив, должно интерпретироваться с точки зрения информации, взятой из другого пути. По умолчанию классы в пакете java.io всегда разрешают относительные пути к текущему каталогу пользователей. Этот каталог называется системным свойством user.dir и обычно является каталогом, в котором была вызвана виртуальная машина Java.

Я расцениваю это так, что если вы создаете объект File с new File("filename") где filename относительный путь, этот путь не будет преобразован в абсолютный путь даже при вызове file.getAbsolutePath().

Update: теперь, когда вы писали код, я могу думать о чем-то, чтобы улучшить его:

  • вы могли бы использовать FilenameFilter найти нужные файлы,
  • отмечают, что list и listFiles возвращение null для объектов без каталога, поэтому нам нужна дополнительная проверка для этого,
  • вы также можете использовать listFiles() во внутреннем цикле, тем самым избегая необходимости создавать новые объекты File w с вручную собранными дорожками. (Кстати, обратите внимание, что добавление \\ вручную к пути не переносимо, правильным способом было бы использовать File.separator).

Конечный результат

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); 
    } 
} 

Обратите внимание, что этот код имитирует поведение исходного фрагмента кода, насколько я понял; в первую очередь, он находит файлы с собственным именем только в прямых подкаталогах из factDir, нерекурсивно.

+2

w0w Peter Я должен сказать это, я думаю, что это один из лучших ответов, которые я когда-либо получал, SO, вы предложили предложение класса MyFilter, как много кода, просто AMAZING. большое спасибо – ant

2

Я думаю, что это может помочь вам тогда и только тогда, когда файл находится в каталоге программы.

первым вы получите каталог программы по:

new File(".").getCanonicalPath() 

затем:

если file находится внутри определенной директории как folder\\filename полный путь будет

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

или если file находится непосредственно в каталоге программы: полный путь wi будет

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

я хочу этот ответ поможет вам :)

Смежные вопросы