2012-03-02 50 views
43

Xin chào Tôi đang tìm giải pháp để liệt kê tất cả các tệp từ thiết bị gốc/Android.Liệt kê tất cả các tệp từ tất cả thư mục trong một danh sách duy nhất

Giả sử có 3 thư mục bên trong thư mục gốc, nhưng tôi muốn hiển thị tất cả các tập tin trong tất cả các thư mục trong một danh sách duy nhất ..

Bây giờ Nếu đang sử dụng

 File f=new File("/sdcard"); 

Sau đó, nó sẽ liệt kê tất cả các tập tin từ thư mục sdcard only..and Nếu tôi sẽ sử dụng

 File f=new File("/download"); 

Sau đó, nó sẽ liệt kê tất cả các file từ thư mục tải về chỉ ..và nếu tôi sẽ sử dụng

 File f=new File("/"); 

Sau đó, nó sẽ liệt kê chỉ có root file direcoty ... không phải là tập tin bên trong/sdcard hoặc/tải ..

Vì vậy, tôi bước những gì phải làm theo để liệt kê tất cả các tập tin với một bộ lọc để chỉ liệt kê .csv tệp từ tất cả thư mục bên trong thư mục gốc.

Cảm ơn ..

Trả lời

111

Hãy thử điều này:

..... 
List<File> files = getListFiles(new File("YOUR ROOT")); 
.... 
private List<File> getListFiles(File parentDir) { 
    ArrayList<File> inFiles = new ArrayList<File>(); 
    File[] files = parentDir.listFiles(); 
    for (File file : files) { 
     if (file.isDirectory()) { 
      inFiles.addAll(getListFiles(file)); 
     } else { 
      if(file.getName().endsWith(".csv")){ 
       inFiles.add(file); 
      } 
     } 
    } 
    return inFiles; 
} 

hoặc biến thể mà không đệ quy:

private List<File> getListFiles2(File parentDir) { 
    List<File> inFiles = new ArrayList<>(); 
    Queue<File> files = new LinkedList<>(); 
    files.addAll(Arrays.asList(parentDir.listFiles())); 
    while (!files.isEmpty()) { 
     File file = files.remove(); 
     if (file.isDirectory()) { 
      files.addAll(Arrays.asList(file.listFiles())); 
     } else if (file.getName().endsWith(".csv")) { 
      inFiles.add(file); 
     } 
    } 
    return inFiles; 
} 
+0

Xin cảm ơn rất nhiều :) – Kanika

+1

Hi Vyacheslav Shilkin, mã của bạn đã hoạt động cho tôi nhưng đầu ra sẽ xuất hiện sau một vài giây (2 giây) 3 giây). Bạn có thể đề xuất điều gì đó để làm cho nó nhanh hơn một chút không? –

+0

Hey Cảm ơn bạn rất nhiều –

1

Bạn có thể sử dụng phương pháp sau đây,

private int readLogList(String filePath) 
{ 
    File directory = Environment.getExternalStorageDirectory(); 

    File folder = new File(directory + ConstantCodes.FILE_SEPARATOR + filePath); 

    if (!folder.exists()) 
    { 
     return 0; 
    } 

    return folder.list().length; 
} 
+1

Nhưng ở đây tôi vẫn cần phải vượt qua tệpPath? Tôi không thể truy cập tất cả các tệp từ tất cả các thư mục – Kanika

+0

thì bạn cần gọi phương thức này theo cách đệ quy – Android

2

Tôi đã sửa đổi Vyacheslav's soluti vì tôi chỉ cần tên tệp bên trong thư mục. Có lẽ nó sẽ hữu ích cho ai đó.

... 
List<String> files = getList(new File("YOUR ROOT")); 
... 
private List<String> getList(File parentDir, String pathToParentDir) { 

    ArrayList<String> inFiles = new ArrayList<String>(); 
    String[] fileNames = parentDir.list(); 

    for (String fileName : fileNames) { 
     if (fileName.toLowerCase().endsWith(".txt") || fileName.toLowerCase().endsWith(".rtf") || fileName.toLowerCase().endsWith(".txd")) { 
      inFiles.add(pathToParentDir + fileName); 
     } else { 
      File file = new File(parentDir.getPath() + "/" + fileName); 
      if (file.isDirectory()) { 
       inFiles.addAll(getList(file, pathToParentDir + fileName + "/")); 
      } 
     } 
    } 

    return inFiles; 
} 
+1

Xin lỗi để nói, nhưng sửa đổi của bạn không có cải tiến. Trước hết bạn thêm các thư mục với ví dụ .txt và tôi thực sự không biết những gì pathToParentDir được cho là parentDir.getParent() không thể sửa chữa được. Cuối cùng, sử dụng "/" không được khuyến khích, sử dụng File.separator thay thế. – Michel

Các vấn đề liên quan