获取具有给定名称的所有文件夹

时间:2013-04-25 13:18:34

标签: java recursion directory

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

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

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

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

我想获得一个包含所有例子的ArrayList。普通文件夹。 虽然递归让我总是很困惑,但我无法做到这一点。

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

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”时的普通文件夹)的所有路径,所以我的结果如下:

  • “根/机器人/[...]/正常”
  • “根/窗口/[...]/正常”
  • “根/ IOS /[...]/正常”

5 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分: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是您要查找的目录的名称,并且具有该名称的目录可以在目录树中多次存在。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在目录中搜索目录时,一种优雅的方法是使用FileFilter或使用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 FileNameFilterNormalDirFilterFocusDirFilter,您可以在其中对特定文件夹搜索名称进行硬编码。在递归期间列出文件时使用这些特定过滤器的实例。

答案 4 :(得分:-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;
}