2014-09-30 64 views
0

我編寫了遞歸掃描文件夾以搜索文件並對其進行處理的函數(foundFile())。如何知道遞歸文件掃描的當前文件夾深度

問題是當函數找到別名文件夾(例如在mac中,當我試圖在/Volumes文件夾中循環時)。腳本無限循環(我不知道爲什麼)。是否有可能知道遞歸的當前「深度」並停在(即)20?

,甚至停止在特定情況下,循環(別名文件夾)

private String[] types = { ".wav", ".mp3", ".ogg", ".wave", ".wma"}; 
public void listFile(String pathname) { 
    File f = new File(pathname); 
    File[] listfiles = f.listFiles(); 
    if(listfiles!=null){ 
     for (int i = 0; i < listfiles.length; i++) { 
      if (listfiles[i].isDirectory()) { 
       File[] internalFile = listfiles[i].listFiles(); 
       if(internalFile!=null){ 
        for (int j = 0; j < internalFile.length; j++) { 
         for(int h=0;h<types.length;h++){ 
          if(internalFile[j].getAbsolutePath().endsWith(types[h])){ 
           found.put(types[h], found.get(types[h])+1); 
           foundFile(internalFile[j]); 
          } 
         } 
         if (internalFile[j].isDirectory()) { 
          String name = internalFile[j].getAbsolutePath(); 
          listFile(name); 
         } 
        } 
       } 
      } else { 
       processed+=1; 
       for(int j=0;j<types.length;j++){ 
        if(f.getAbsolutePath().endsWith(types[j])){ 
         this.found.put(types[j], found.get(types[j])+1); 
         foundFile(listfiles[i]); 
        } 
       } 
      } 
     } 
    } 
} 
+0

你可以簡單地通過深度參數手你使用'listFile'方法,在每次調用時增加它,並在達到所需深度時停止遞歸。 – qqilihq 2014-09-30 19:00:32

+0

您必須將級別參數傳遞給每個遞歸調用,並在執行遞歸時將其遞增。 – rafalopez79 2014-09-30 19:00:57

+0

這樣你可以計算出你訪問過多少個文件夾。不是深度 – 2014-09-30 19:02:23

回答

2

這樣的事情,增加一個級別參數:

public void listFile(final String pathname, int level) { 
    if (level == 20){ 
     return; 
    } 
    final File f = new File(pathname); 
    final File[] listfiles = f.listFiles(); 
    if (listfiles != null) { 
     for (int i = 0; i < listfiles.length; i++) { 
      if (listfiles[i].isDirectory()) { 
       final File[] internalFile = listfiles[i].listFiles(); 
       if (internalFile != null) { 
        for (int j = 0; j < internalFile.length; j++) { 
         for (int h = 0; h < types.length; h++) { 
          if (internalFile[j].getAbsolutePath().endsWith(types[h])) { 
           found.put(types[h], found.get(types[h]) + 1); 
           foundFile(internalFile[j]); 
          } 
         } 
         if (internalFile[j].isDirectory()) { 
          final String name = internalFile[j].getAbsolutePath(); 
          listFile(name, level + 1); 
         } 
        } 
       } 
      } else { 
       processed += 1; 
       for (int j = 0; j < types.length; j++) { 
        if (f.getAbsolutePath().endsWith(types[j])) { 
         this.found.put(types[j], found.get(types[j]) + 1); 
         foundFile(listfiles[i]); 
        } 
       } 
      } 
     } 
    } 
} 
+1

遞歸調用中存在一個錯誤 - 應該是「level + 1」,而不是「level ++」。 – Sbodd 2014-09-30 19:05:39

+0

@Sbodd好吧!它改變了 – rafalopez79 2014-09-30 19:07:49