2011-02-28 108 views
0

我需要在根目录下找到具有给定名称的域名(我将它称为“固定域名”)。 我有以下目录结构:查找与给定名称匹配的子域名

- rootdir 
-- someName1 
--- fixedName 
-- somename2 
--- fixedName 

在根目录有一些目录,其名称是不明,而那些显示目录下有我的目标迪尔斯。 的结果我的 “发现” 应该是:[ROOTDIR/someName1/fixedName,ROOTDIR/someName2/fixedName]

我试着用Commons FileUtils,具体的方法listfiles,执行以下操作:

final File ROOTDIR = new File("/rootdir"); 
IOFileFilter nameFilter = new NameFileFilter("fixedName"); 
Collection<File> files = FileUtils.listFiles(ROOTDIR, TrueFileFilter.TRUE, nameFilter); 

但它不起作用,因为subdir walk在someName * dirs的级别停止。 我可以写一个自定义的方法,但我想知道一个人是否能实现什么,我需要使用共享文件实用程序或Java API(使用一些高级的功能,我的意思)

回答

2

我刚才做了它与手动File类,类似:

java.util.List<File> result = new ArrayList<File>(); 
    final String searchFor = "fixedName"; 

    for (File child : f.listFiles()) { 
     result.addAll(Arrays.asList(
      child.listFiles(new FilenameFilter() { 
       public boolean accept(File parent, String childName) { 
        return childName.equals(searchFor); 
       } 
      } 
     ))); 
    } 
+0

+1使用标准API,listfiles()已经在** File **类中,我不明白他为什么使用commons- io在第一个 – 2011-02-28 16:39:50

+0

这个代码的作品,但它不是递归的Commons listFiles(我的问题显示了我的树,但我想将它应用到更深的),我只是好奇我是否已经理解正确的公用fileutils api – cdarwin 2011-02-28 17:20:16

+0

虽然很容易把它变成一个递归函数。实际上无论如何都会清理它。使用Commons listFiles对于这个目的似乎是不必要的,因为您可以用一些更容易理解的方式在标准API中将它写入几行。 – 2011-03-01 16:19:06

0

我没有亲自使用该功能,但是从看API,我认为你是不正确的解释方法的参数。

listfiles需要一个根目录,一个文件过滤器和一个目录过滤器。目录过滤器用于确定要查找哪些子目录,而不是查找目录。你想在所有子目录中查找“fixedName”。我想你实际上是想调用这样的方法:

final File ROOTDIR = new File("/rootdir"); 
IOFileFilter nameFilter = new NameFileFilter("fixedName"); 
Collection<File> files = 
     FileUtils.listFiles(ROOTDIR, nameFilter, TrueFileFilter.INSTANCE); 
+0

这是我的第一次尝试,但它不起作用,因为该方法不会在第一级下降,因为它在比较时会停止 - 在nameFilter中 - “someName1”与“固定名称”,因此它不会探索下面的文件someName1 – cdarwin 2011-02-28 18:00:52

+0

@cdarwin更深入地观察这个问题,在我的答案中指定的方式调用函数实际上是正确地行走树(尝试搜索嵌套文件而不是目录)。问题是它只搜索文件,而不是目录。在内部,apache commons创建effFileFilter = AndFileFilter(yourFilter,NotFileFilter(DirectoryFileFilter))。反正我看不出使用这个功能。 – gcooney 2011-02-28 19:12:53

相关问题