2

我正在寻找一种解决方案来查找给定目录中具有相同名称的所有文件夹。

所以我的文件夹结构如下所示:

                                       Root
                         |                |             |
                     android          windows          ios
                    |       |        |       |       |      | 
                  focus    normal  focus   normal  focus   normal

注意:客户端和图标集之间有更多文件夹,这就是我需要递归的原因。

我想获得一个包含所有路径的 ArrayList,例如 Normal 文件夹。尽管递归一直让我很困惑,但我无法做到。

这是我的第一次尝试,它应该返回根文件夹(参数路径)中包含的所有目录。字符串图标集应在之后定义搜索文件夹的名称。

private static ArrayList<String> getAllIconSetFolders(String path, String iconset) {
        ArrayList<String> pathes = new ArrayList<String>();

        File folder = new File(path);
        File[] listOfFiles = folder.listFiles();

        for (File file : listOfFiles) {
            if (file != null && file.isDirectory()) {
                pathes.addAll(getAllIconSetFolders(file.getAbsolutePath(), iconset));
            }
        }
        return pathes;
    }

在这种情况下,它将返回一个空的 ArrayList。

如何获取(String iconset =“normal”时的普通文件夹)的所有路径,所以我的结果如下所示:

  • “根/android/[...]/正常”
  • “根/windows/[...]/正常”
  • “根/ios/[...]/正常”
4

5 回答 5

2

我刚刚测试了以下代码,它似乎可以正常工作:

public static List<File> findDirectoriesWithSameName(String name, File root) {
  List<File> result = new ArrayList<>();

  for (File file : root.listFiles()) {
    if (file.isDirectory()) {
      if (file.getName().equals(name)) {
        result.add(file);
      }

      result.addAll(findDirectoriesWithSameName(name, file));
    }
  }

  return result;
}

您的原始代码几乎就在那里,您只是省略了实际将匹配目录添加到结果列表的部分。


经测试:

C:\tmp\foo
C:\tmp\foo\bar
C:\tmp\foo\baz
C:\tmp\foo\baz\foo
C:\tmp\foo\baz\foo\bar

使用

public static void main(String[] args) throws Exception {
  List<File> files = findDirectoriesWithSameName("foo", new File("C:\\tmp"));

  for (File f :files) {
    System.out.println(f);
  }    
}

输出:

C:\tmp\foo
C:\tmp\foo\baz\foo
于 2013-04-25T13:36:10.597 回答
1

经测试。作品。需要Java 7。

public static void main(String[] args) {
    List<String> paths = new ArrayList<String>();
    getAllFolders("/path/to/folder", "normal", paths);
}


private static void getAllFolders(String path, String folderName, List<String> paths) throws Exception {

    Path mainPath = Paths.get(path);
    Iterator<Path> stream = Files.newDirectoryStream(mainPath).iterator();

    while(stream.hasNext()) {
        Path currentPath = stream.next();
        String currentFolderName = currentPath.getFileName().toString();
        if(currentFolderName.equals(folderName)) {
            paths.add(currentPath.toString());
        }
        getAllFolders(currentPath.toString(), folderName, paths);
    }

}
于 2013-04-25T13:31:34.407 回答
1

您需要添加目录名称,pathes否则它将始终为空。你的代码应该是这样的:

private static List<String> getAllIconSetFolders(String path, String iconset) 
{
  List<String> pathes = new ArrayList<String>();

  File folder = new File(path);

  for (File file : folder.listFiles()) 
  {
    if (file.isDirectory()) 
    {
      if (file.getName().equals(iconset))
      {
        pathes.add(file.getAbsolutePath());
      }
      else
      {
        pathes.addAll(getAllIconSetFolders(file.getAbsolutePath(), iconset));
      }
    }
  }

  return pathes;
}

这假定iconset是您要查找的目录的名称,并且具有该名称的目录可以在目录树中多次存在。

于 2013-04-25T13:34:08.720 回答
1

在目录中搜索目录时,一种优雅的方法是使用FileFilteror 进行名称匹配使用FileNameFilter。最重要的是,您应用标准递归方式,完整的解决方案将是:

static void test()
{
    File f = new File("e:\\folder");
    List<File> res = new ArrayList<File>();
    search(f, res, "normal");
    System.out.println(res);
    search(f, res, "focus");
    System.out.println(res);
}

static void search(File f, List<File> res, final String search)
{
    if(f.isDirectory())
    {
        File[] result = f.listFiles(new FilenameFilter()
        {
            public boolean accept(File file, String name)
            {
                return file.isDirectory() && name.equals(search);
            }
        });
        if(result != null)
        {
            for(File file : result)
            {
                res.add(file);
            }
        }

        //search further recursively
        File[] allFiles = f.listFiles();
        if(allFiles != null)
        {
            for(File file: allFiles)
            {
                search(file, res, search);
            }
        }
    }
}

或者你可以extend FileNameFilterNormalDirFilter或者你可以FocusDirFilter在哪里硬编码特定的文件夹搜索名称。在递归期间列出文件时使用这些特定过滤器的实例。

于 2013-04-25T13:40:00.650 回答
-1

如果你有这个结构,你能不能做

public static List<File> subdirectories(File root, String toFind) {
    List<File> ret = new ArrayList<File>();
    for(File dir : root.listFiles()) {
        File dir2 = new File(dir, toFind);
        if (dir2.isDirectory())
            ret.add(dir2);
    }
    return ret;
}
于 2013-04-25T13:25:12.023 回答