2011-02-28 148 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

相關問題