2012-05-14 20 views
5

Kök dizinde ve alt dizinlerde bir dosya bulmaya çalışıyorum.Dosya arama sırayla

Adım1- Belirtilen bir yoldan bir dizin bulun. Adım 2 - Yukarıdaki dizin bulunursa, bir alt dizinden birinde bir dosya arayın. Benim yukarıda gereksinimleri hem karşıladığında Bunun için

, ben yinelemeli arama aşağıda kod parçacığını kullanın .. Şimdi, işte mesele, nasıl ya yinelenen patlak mı olduğunu ..?

boolean bFileFound = false; 
File fileFound  = null; 

private void findFile(File aFile, String sDir){ 

    String filePath = aFile.getAbsolutePath(); 

    if(aFile.isFile() && filePath.contains(sDir)){ 

       if(aFile.getName().contains("test2.adv")){ 
        Log.d(TAG, "[FILE] " + aFile.getName()); 
        fileFound = aFile; 
        bFileFound = true; 
       } 

      // return true; 
    }else if(aFile.isDirectory()){ 

     String sDirName = aFile.getName(); 
     Log.d(TAG, "[DIR] " + sDirName); 

     if(sDirName.contains(sDir)){ 

      Log.d(TAG, "Found the directory..& Absolute Path = " + aFile.getAbsolutePath()); 
      sDir = sDirName; 
     } 

     File[] listFiles = aFile.listFiles(); 

     if(listFiles != null){ 

      for(int i = 0; i < listFiles.length; i++){ 

       if(bFileFound) 
        return; 

      findFile(listFiles[ i ], sDir); 
      } 
     }else{ 

      Log.d(TAG, " [ACCESS DENIED]"); 
     } 
    } 

    // return null; 
} 

sayesinde DK Şimdi

cevap

6
/** 
* Search file a file in a directory. Please comment more here, your method is not that standard. 
* @param file the file/folder where to look our file for. 
* @param sDir a directory that must be in the path of the file to find 
* @param toFind the name of file we are looking for. 
* @return the file we were looking for. Null if no such file could be found. 
*/ 
private File findFile(File aFile, String sDir, String toFind){ 
    if(aFile.isFile() && 
      aFile.getAbsolutePath().contains(sDir) && 
      aFile.getName().contains(toFind)) { 
         return aFile; 
     } else if(aFile.isDirectory()) { 
     for(File child : aFile.listFiles()){ 
      File found = findFile(child, sDir, toFind); 
        if(found != null) { 
         return found; 
        }//if 
     }//for 
    }//else 
    return null; 
}//met 

, sen findFile çağırmak üçüncü parametre olarak "test2.adv" geçmektedir. Bu onu kodlamaktan daha ilginç.

Ayrıca, birden çok dosyanın aramanızla eşleşebileceğini lütfen unutmayın, bu işlev iyi işlemez, ilk bulunanı döndürür.

+0

Teşekkür Sincolas .. bu kadar awsome ... – codersnet

0

FileFilter kullanarak bu sorunu çözmek için yinelemeli olarak arama yapmak için farklı bir yöntem aldım. Benim durumumda, dosya adı davasının önemli olmadığı bir ".json" uzantılı herhangi bir dosya arıyordu.

İlk, özyinelemeli arama Ardından

/** 
* A {@link FileFilter} implementation that checks recursively files of a 
* specified fileName or extension string 
*/ 
public class FileExtensionFinder implements FileFilter { 
    private final String fileName; 
    private final List<File> foundFiles; 

    /** 
    * Constructor for FileExtensionFinder 
    * @param fileName string of the filename or extension being searched for 
    */ 
    public FileExtensionFinder(String fileName) { 
     this.fileName = fileName; 
     this.foundFiles = new ArrayList<>(); 
    } 

    @Override 
    public boolean accept(File pathname) { 
     // accept anything that is a folder or matches the fileName string 
     return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(fileName); 
    } 

    /** 
    * Searches recursively for all files with the provided filename/extension string 
    * @param filesArray an array of files (including folders) to iterate over 
    */ 
    public List<File> findFiles(File... filesArray) { 
     for (File file : filesArray) { 
      if (file.isDirectory()) { 
       findFiles(file.listFiles(this)); 
      } else if (file.getName().toLowerCase().endsWith(fileName)) { 
       foundFiles.add(file); 
      } 
     } 
     return foundFiles; 
    } 
} 

dosya adını tutmak için bir FileFilter uygulama sınıfı oluşturmak ve gerçekleştirmek, kullanım oldukça basittir:

File fileLocation = // get your file here ... 
List<File> foundFiles = new FileExtensionFinder(".json").findFiles(fileLocation); 
İlgili konular