【问题标题】:List files from directories and sub directories in java including only partial file paths列出java中目录和子目录中的文件,仅包括部分文件路径
【发布时间】:2012-09-20 02:53:14
【问题描述】:

我需要从给定的目录中获取文件的路径及其在 java 中的父目录,但不包括它。

例如,如果我的方法被赋予路径:/home/user/test 作为路径,它将返回该目录中及其下所有文件的路径。

因此,如果 /home/user/test 有子文件夹:/subdir1/subdir2 每个包含 file1.txtfile2.txt,那么该方法的结果将是 2 个包含 /subdir1/file1.txt/subdir2/file2.txt 的字符串

如果subdir1 内部有一个名为subsubdir 的目录和file3.txt,那么为该文件创建的字符串将为/subdir1/subsubdir/file3.txt,并且如果还有其他子目录将继续存在。

我的想法是我只想要文件上方的目录路径而不是绝对路径,所以只有初始给定路径之后的目录。

我知道这有点令人困惑,但我相信有人能理解它。现在我只有一个递归函数,可以打印出文件名和它们的绝对路径。

对此有任何帮助吗?

【问题讨论】:

  • 部分文件路径是什么意思?在您的帖子中,它是 root 相对 /home/user/test
  • 如果您有绝对路径,只需将它们的初始部分剪掉等于您的目录,例如/home/user/test/quick/brown/fox.txt 在砍掉最初的 /home/user/test/ 部分后变为 quick/brown/fox.txt

标签: java


【解决方案1】:

如果您尝试过某事并就此提出问题,那该多好……

不过……

public class TestFileSearch {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new TestFileSearch();
    }

    public TestFileSearch() {
        File parentPath = new File("C:/Users/shane/Documents");
        List<String> files = list(parentPath);

        for (String file : files) {
            System.out.println(file);
        }
    }

    protected List<String> list(File parent) {
        return listFiles(parent, parent);
    }

    protected List<String> listFiles(File parent, File folder) {
        List<String> lstFiles = new ArrayList<String>(25);
        if (folder.isDirectory()) {

            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        lstFiles.addAll(listFiles(parent, file));
                    } else {
                        String path = file.getPath();
                        String offset = parent.getPath();

                        path = path.substring(offset.length());
                        lstFiles.add(path);
                    }
                }
            }
        }

        return lstFiles;
    }
}

你可以简单地做一个普通的文件夹递归,返回一个文件列表,然后去掉前缀,但这取决于你

【讨论】:

    【解决方案2】:

    如何使用您当前拥有的绝对路径但使用String.replace从中删除前缀

    你说你有完整的绝对路径,比如 full
    然后就做

    String relative = full.replace(prefix, "");
    

    【讨论】:

      【解决方案3】:

      如果您输入“/home/user/text”,则所有文件的绝对路径都将以 /home/user/text/ 开头。如果您已经能够打印 text/ 下所有文件的列表,那么您需要做的就是获取合适的子字符串。

      下面的函数应该访问pathToDir下的所有文件。在 printFileName 函数中,您可以删除 /home/user/text 部分并打印文件名

      public static void gotoAllFiles(File pathToDir) {
          if (pathToDir.isDirectory()) {
              String[] subdirs = pathToDir.list();
              for (int i=0; i<subdirs.length; i++) {
                  gotoAllFiles(new File(pathToDir, subdirs[i]));
              }
          } else {
              printFileName(pathToDir);
          }
      }
      

      【讨论】:

      • 好的,有没有一种简单的方法可以将它们分开而不必指定字符串的计数?因为 substring 函数需要一个 int 但获取字符串的长度会返回一个 long 并且转换它会导致问题。
      • 字符串的“计数”是什么意思?字符串的长度几乎永远不会超出 int 的范围。您可以安全地使用 (int)longLength。
      【解决方案4】:

      对于找到的每个文件,打印file.getAbsolutePath().substring(rootPath.length());

      【讨论】: