2011-12-27 41 views
69

Dưới đây là mã của tôi cho đến nay:Cách liệt kê các tệp trong thư mục android?

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures"; 

     AssetManager mgr = getAssets(); 

     try { 

      String list[] = mgr.list(path); 
      Log.e("FILES", String.valueOf(list.length)); 

      if (list != null) 
       for (int i=0; i<list.length; ++i) 
        { 
         Log.e("FILE:", path +"/"+ list[i]); 
        } 

     } catch (IOException e) { 
      Log.v("List error:", "can't list" + path); 
     } 

Tuy nhiên, trong khi tôi không có tập tin trong thư mục đó, nó sẽ trả tôi list.length = 0 ... bất kỳ ý tưởng?

Trả lời

208

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

String path = Environment.getExternalStorageDirectory().toString()+"/Pictures"; 
Log.d("Files", "Path: " + path); 
File directory = new File(path); 
File[] files = directory.listFiles(); 
Log.d("Files", "Size: "+ files.length); 
for (int i = 0; i < files.length; i++) 
{ 
    Log.d("Files", "FileName:" + files[i].getName()); 
} 
+7

Cảm ơn Yury, file.length kỳ lạ cho một NullPointerException ... bất kỳ ý tưởng? Spasibo! –

+8

Tôi nghĩ rằng bạn không có tệp trong thư mục được chỉ định. Hãy thử kiểm tra tập tin [] cho null. Nếu nó là null thì bạn không có bất kỳ kết quả và file.length gây ra ngoại lệ. – Yury

+3

Xuất hiện nó chỉ là thiếu một "/" :) Cảm ơn! –

2

path của bạn không nằm trong thư mục nội dung. Hoặc bạn liệt kê các file trong thư mục tài sản bằng phương pháp AssetManager.list() hoặc bạn liệt kê các tập tin trên thẻ SD của bạn bằng phương tiện của File.list()

6

Vâng, AssetManager danh sách các file trong thư mục assets đó là bên trong tệp APK của bạn. Vì vậy, những gì bạn đang cố gắng liệt kê trong ví dụ trên là [apk]/assets/sdcard/Pictures.

Nếu bạn đặt một số ảnh trong thư mục assets bên trong ứng dụng của bạn và chúng nằm trong thư mục Pictures, bạn sẽ làm mgr.list("/Pictures/").

Mặt khác, nếu bạn có tập tin trên sdcard nằm ngoài của tập tin APK của bạn, trong thư mục Pictures, sau đó bạn sẽ sử dụng File như vậy:

File file = new File(Environment.getExternalStorageDirectory(), "Pictures"); 
File[] pictures = file.listFiles(); 
... 
for (...) 
{ 
log.e("FILE:", pictures[i].getAbsolutePath()); 
} 

Và có liên quan liên kết từ các tài liệu :
File
Asset Manager

+0

Đã thử rằng "File [] pictures = file.listFiles();", nhưng nó cũng cung cấp cho một NullPointException ... hmm ... –

+1

Xuất hiện nó chỉ là thiếu một "/" :) Cảm ơn! –

+1

Cảm ơn bạn đã cứu ngày :) –

32

tôi chỉ phát hiện ra rằng:

new File("/sdcard/").listFiles() trả về NULL nếu bạn không có:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

bộ trong file AndroidManifest.xml của bạn.

+1

Tôi biết đây là sự thật, nhưng ... Đây có phải là câu trả lời không? Hoặc phải là một bình luận? –

+5

Ngoài ra, trên Android 6.0+ quyền cần được cấp trong Cài đặt-> Ứng dụng-> Ứng dụng của bạn-> Quyền. –

+0

Nó cũng trả về null nếu Thư mục trống –

1
String[] listOfFiles = getActivity().getFilesDir().list(); 

hoặc

String[] listOfFiles = Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS).list(); 
0

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

public class GetAllFilesInDirectory { 

public static void main(String[] args) throws IOException { 

    File dir = new File("dir"); 

    System.out.println("Getting all files in " + dir.getCanonicalPath() + " including those in subdirectories"); 
    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); 
    for (File file : files) { 
     System.out.println("file: " + file.getCanonicalPath()); 
    } 

} 

} 
1

Có hai điều mà có thể xảy ra:

  • You are not thêm READ_EXTERNAL_STORAGE phép AndroidManifest.xml bạn
  • Bạn đang nhắm mục tiêu Android 23 và bạn không yêu cầu quyền đó cho người dùng. Chuyển xuống Android 22 hoặc yêu cầu người dùng cấp quyền đó.
6

Ngoài tất cả các câu trả lời ở trên:

Nếu bạn đang trên Android 6.0+ (API Cấp 23+) bạn phải tự hỏi một cách rõ ràng cho phép truy cập lưu trữ bên ngoài.Chỉ cần có

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

trong tệp kê khai của bạn sẽ không đủ. Bạn cũng đã tích cực yêu cầu sự cho phép trong hoạt động của bạn:

//check for permission 
if(ContextCompat.checkSelfPermission(this, 
      Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED){ 
    //ask for permission 
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_PERMISSION_CODE); 
} 

Tôi khuyên bạn nên đọc bài viết này: http://developer.android.com/training/permissions/requesting.html#perm-request

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