2011-12-19 17 views
1

我在桌面應用程序中工作使用的Java窗口。在我的應用程序中,需要搜索所有.php文件。要做到這一點,本地文件搜索與迭代算法

這裏我用遞歸方法

import java.io.File; 

public class Copier { 

    public static void find(String source,String rep) { 
     File src = new File(rep); 
     if (src!= null && src.exists() && src.isDirectory()) { 
      String[] tab = src.list(); 
      if (tab != null) { 
       for(String s : tab) { 
        File srcc = new File(rep+"\\"+s); 
        if (srcc.isFile()) { 
         if (srcc.getName().matches(".*"+source+"$")) { 
          System.out.println(s); 
         } 
        } else { 
         find(source,srcc.getAbsolutePath()); 
        } 
       } 
      } else { 
       //System.out.println(" list is null"); 
      } 
     } 
    } 

這裏我用迭代算法與隊列廣度優先搜索,但它不能正常工作

import java.io.File; 
import java.util.LinkedList; 


public class Copier { 
public static void find(String source,String rep) 
{ 
    File src=new File(rep); 
    LinkedList<File> qu=new LinkedList(); 
    if(src!=null && src.exists() && src.isDirectory()) 
    { 
     File[] tab=src.listFiles(); 
     if(tab!=null) 
     { 
     for(File s:tab) 
     { 
      qu.addLast(s); 
     } 
     while(!qu.isEmpty()) 
     { 
      File srcc=qu.getFirst(); 
      qu.removeFirst(); 
      if(srcc.isFile()) 
      { 
       if(srcc.getName().matches(".*"+source+"$")) 
        System.out.println(srcc.getName()); 
      } 

      else 
      { 
       System.out.println(srcc.getName()); 
       qu.addLast(srcc); 
      } 
     } 

     } 
    } 
} 

public static void main(String[] args) 
{ 
     try { 
      find(".php","C:\\AppServ"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

} 
} 
+0

什麼不工作?什麼是輸出?請提供更多信息。 – Jon 2011-12-19 18:41:57

+0

是的,我需要找到所有的文件。 PHP在我的本地我使用迭代 – 2011-12-19 19:06:51

回答

1

Anouar,

嘗試使用Apache Commons IO
您可以使用

org.apache.commons.io.FileUtils
類描述 here in API Javadoc

它提供了非常有用的,性能優化和無缺陷的靜態方法來搜索文件(listFiles和iterateFiles方法),複製/移動文件和目錄,在「單行代碼」還有更多不錯的東西。

有沒有必要重新發明車輪;)

0

你應該儘量不要與第一個文件夾/路徑和子文件夾的區別。現在瑜伽正在做的是從src文件夾中取出所有文件和文件夾,並將它們添加到隊列中。然後你刪除第一個,並檢查它是否是一個文件。如果是,那麼如果它匹配你打印它的模式。如果它不是文件,則打印名稱並將其重新添加到隊列中!

想想吧。如果您的src文件夾包含一個文件夾,則將其從隊列中取出,然後重新添加並重復,直到隊列爲空(當然永遠不會)。

你需要的東西更多類似這樣的

public static void find(String source,String rep) { 
    String pattern = ".*"+source+"$"; 
    LinkedList<File> qu = new LinkedList<File>(); 
    File src = new File(rep); 
    qu.add(src); 
    while(!qu.isEmpty()) { 
     File srcc = qu.removeFirst(); 

     if(srcc!=null && srcc.exists()) { 
      if (srcc.isDirectory()) { 
       File[] tab=srcc.listFiles(); 
       for(File s: srcc.listFiles()) { 
        qu.addLast(s); 
       } 
      } else if (srcc.isFile()) { 
       if(srcc.getName().matches(pattern)) { 
        System.out.println(srcc.getName()); 
       } 
      } 
     } 
    } 
} 

其中,如果當前文件目錄下的所有子文件被添加到隊列中,如果它的名字是爲匹配檢查的文件。