2012-05-15 3 views
0

내 앱의 일부로 특정 폴더 만 나열하는 파일 브라우저가 있어야합니다. 예를 들어 어떤 레벨의 하위 폴더에있는 이미지 파일의 경로에있는 폴더 만 나열하십시오.android 이미지가있는 모든 폴더를 나열하십시오.

재귀를 사용하여 할 수 있습니다. 그러나 성능에 영향을 미칩니다. 특히 최상위 수준에서 폴더를 찾는 경우 많은 재귀 호출이 필요합니다. 이

내가 재귀 검색 이외의 다른 방법이 있는지 알고 싶어

public List<GeneralFileItem> getGridItemsList(String root) { 
    List<GeneralFileItem> gridItemsList = new ArrayList<GeneralFileItem>(); 
    File file; 
    file = new File(root); 
    File list[] = file.listFiles(); 
    if (list.length == 0) { 
     return null; 
    } 
    for (int i = 0; i < list.length; i++) { 
     GeneralFileItem item = new GeneralFileItem(); 
     File temp_file = new File(file.getAbsolutePath(), list[i].getName()); 
     if (hasPhoto(temp_file)) { 
      item.setPath(file.getAbsolutePath() + "/" + list[i].getName()); 
      item.setName(list[i].getName()); 
      if (temp_file.listFiles() != null) { 
       item.setType(GeneralFileItem.DIRECTORY_TYPE); 
      } else { 
       item.setType(GeneralFileItem.FILE_TYPE); 
      } 
      gridItemsList.add(item); 
      //Log.i(TAG,"added"+list[i].getName()); 
     } 
    } 
    return gridItemsList; 

} 

private boolean hasPhoto(File temp_file) { 
    //Log.i(TAG,temp_file.getName()); 

    if (temp_file.listFiles() == null) { 
     if (temp_file.getName().toUpperCase().endsWith(("JPG"))) { 
      //Log.i(TAG,temp_file.getName()+ "is a photo"); 
      return true; 
     } else 
      return false; 

    } 
    else{ 
     File list[] = temp_file.listFiles(); 

     for (int i = 0; i < list.length; i++) { 
      if(hasPhoto(list[i])) 
       return true; 
     } 

    } 

    return false; 
} 

아래에 내 코드를 참조하시기 바랍니다 할 수있는 더 좋은 방법이 있나요. Android에서 파일은 어떻게 유지됩니까? 나는 다양한 파일 시스템이 지원되며 하드웨어 제조사와 다르다는 것을 알고있다. 나는 모든 .jpg 파일을 얻을 수있는 FileTable이있는 것과 같은 방법이 있는지 알고 싶습니다.

+0

시도가 사용하는 경우

private ArrayList<File> putImgFldr(File[] fileArray) { // TODO Auto-generated method stub ArrayList<File> a = new ArrayList<File>(); for (int i = 0; i < fileArray.length; i++) { if (fileArray[i].isDirectory()) { //if file is folder pass that file trough this method a.addAll(putImgFldr(fileArray[i].listFiles())); } else if (fileArray[i].getAbsolutePath().endsWith(".jpg") || fileArray[i].getAbsolutePath().endsWith(".png")) { // if file is img ad it's parent, folder to ArrayList a.add(fileArray[i].getParentFile()); // this finishes the file searching // because the image has allready bean found i = fileArray.length + 1; } } return a; } 

지금은 alFolders에 다른 파일 []를 추가 할 수 있습니다 http://docs.oracle.com/javase/1.4.2/docs/api/java/io /FilenameFilter.html .... –

+0

답장을 보내 주셔서 감사합니다. 제안한 filenamefilter 인터페이스는 모든 이미지 파일을 현재 디렉토리로 가져 오는 데 유용합니다. 내 요구 사항은 모든 수준에서 하위 폴더 중 하나에 최소한 하나의 이미지가있는 모든 디렉토리를 얻는 것입니다. – png

+0

이 링크를 확인하십시오. 도움이 될 수 있기를 바랍니다. http://stackoverflow.com/questions/4195660/get-list-of-photo-galleries-on-android –

답변

0

FilenameFilter을 사용하여 특정 유형의 파일을 검색하십시오. 재귀 검색하고자하는 경우

는 현재 당신은 당신이 찾은 각 파일이 디렉토리 여부

귀하 너 한테있을 법한 있는지 확인해야합니다에만 현재 directory.However을 확인하는

File file; 
file = new File(root); 
File list[] = file.listFiles(); 
if (list.length == 0) { 
    return null; 
} 
for (int i = 0; i < list.length; i++) { 
    if(list[i].isDirectory()){ 
     //Then go inside it to search for specific file 
     File subList[] = list[i].listFiles(); 
     //search for jpg.. 
     }else if("is this jpg"){ 
     //Add to list 
     } 
    } 

이것을 단순화하기 위해 요구 사항에 따라 메소드에이를 분리 할 수 ​​있습니다.

+0

현재 재귀를하고 있습니다. 내 문제는 재귀 적으로 검색을 완료하는 데 막대한 시간이 필요하다는 것입니다. 중요한 점은 재귀 적으로 파싱하기 때문에 filefilter가 성능을 향상시키는 데 어떻게 도움이되는지 이해할 수 없습니다.내가 하위 폴더가 적은 폴더에 있다면 내 골동품은 더 빠릅니다 – png

+0

문제는 먼저 througout을 검색하여 목록에 추가 한 다음 gridview.you에서 렌더링하는 것입니다. 여기를 참조하십시오 예 : https : // github .com/desertjim/LazyLoadingGridView –

0

다음은 내가 작성한 것입니다. 그것은 매력처럼 작동합니다!

먼저이 파일을 작성해야합니다,이 하나는 SD 카드 []

File[] fileArray = rootDirectory.listFiles(); 

그런 다음 당신이 ArrayList의를 만들려면 파일에있는 모든 파일을 나열해야보다

File = rootPrimary = new File(Environment.getExternalStorageDirectory()); 

의 루트 내가 만든 메서드와 동일하게 설정하고 File []을 전달합니다.

ArrayList<File> alFolders = new ArrayList<File>(); 
     alFolder = putImgFldr(fileArray); 

이 메서드는 모든 dor 확장자가 .jpg 및 .png 인 이미지가 포함 된 외각. nessesery

alFolders.addAll(putImgFldr(secFileArray)); 
관련 문제