代码之家  ›  专栏  ›  技术社区  ›  ant

在Java中获取文件完整路径

  •  8
  • ant  · 技术社区  · 14 年前

    当我经过 File file 到一个方法,我正试图得到它的完整路径 file.getAbsolutePath(); 无论使用绝对路径还是规范路径,我总是得到相同的结果。 PATH_TO_MY_WORKSPACE/projectName/filename 它不在那里,我怎样才能得到文件的确切位置?

    谢谢你

    细节:

    下面是一些代码和这个解决方案(它是坏的,但它起作用):

     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 ,我只查找temp_compare_file值的tobeprocessed.txt文件,并将其发送到process方法,该方法读取文件并对其进行处理。

    如果有人能更好地解决我会很好的

    2 回复  |  直到 7 年前
        1
  •  13
  •   Péter Török    14 年前

    引用自 Javadoc 可能有帮助:

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

    我这样解释,如果你创造了 File 对象与 new File("filename") 哪里 filename 是相对路径,即使调用 file.getAbsolutePath() .

    更新: 既然您发布了代码,我可以考虑一些改进方法:

    • 你可以使用 FilenameFilter 要查找所需的文件,
    • 注意 list listFiles 返回 null 对于非目录对象,我们需要额外检查,
    • 你也可以用 listFiles() 再次在内部循环中,从而避免了创建新的 文件 具有手动组装路径的对象。(顺便说一下,请注意 \\ 手动到路径是不可移植的;正确的方法是使用 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
  •  2
  •   Adham Gamal    7 年前

    我认为有一种方法可以帮助您,如果并且仅当文件在程序目录中。

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

    new File(".").getCanonicalPath()
    

    然后:

    如果 file 在特定目录中,如 folder\\filename 完整路径将是

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

    或如果 文件 直接在程序目录中: 完整路径将是

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

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