在java中获取文件的完整路径

时间:2010-06-05 20:28:30

标签: java

当我将File file传递给某个方法时,我正试图获得像file.getAbsolutePath();这样的完整路径,无论我使用绝对路径还是规范路径,我都会得到相同的结果{{1}并且它不存在,我怎样才能获得文件的确切位置?

谢谢

详情:

以下是一些代码和解决方案(不好但工作正常):

PATH_TO_MY_WORKSPACE/projectName/filename

我正在循环使用factDir为 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)); } } } } } 的目录,我正在寻找只有TEMP_COMPARE_FILE值的BeProcessed.txt文件,并且我将它们发送到读取文件并处理它的进程方法。

如果有人能够更好地解决问题我会很高兴

2 个答案:

答案 0 :(得分:13)

来自Javadoc的引用可能会有所帮助:

  

路径名,无论是抽象路径还是字符串形式,都可以是绝对相对。绝对路径名是完整的,因为不需要其他信息来定位它表示的文件。相反,相对路径名必须根据从其他路径名获取的信息来解释。默认情况下,java.io包中的类始终解析当前用户目录的相对路径名。此目录由系统属性user.dir命名,通常是调用Java虚拟机的目录。

我对此进行了解释,以便如果您使用File创建new File("filename")对象,其中filename是相对路径,则即使通过调用,该路径也不会转换为绝对路径file.getAbsolutePath()

更新:现在您发布了代码,我可以考虑一些方法来改进它:

  • 您可以使用FilenameFilter查找所需的文件,
  • 请注意,listlistFiles会返回null非目录对象,因此我们需要对其进行额外检查,
  • 您还可以在内部循环中再次使用listFiles(),从而避免使用手工组装路径创建新的File对象。 (顺便说一下,手动将\\附加到路径上是不可移植的;正确的方法是使用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直接子目录中找到具有正确名称的文件,非递归。

答案 1 :(得分:2)

我认为,当且仅当文件位于程序目录中时,它才有助于您。

首先通过以下方式获取程序目录:

new File(".").getCanonicalPath()

然后:

如果file位于folder\\filename等特定目录中 完整路径将是

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

或者如果file直接位于程序目录中: 完整路径将是

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

我希望这个答案可以帮助你:)