Làm thế nào để liệt kê các tập tin trong một thư mục android?


120

Đây là mã của tôi cho đến nay:

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 có tệp trong dir đó, nó trả về cho tôi list.length = 0 ... bất kỳ ý tưởng nào?

Câu trả lời:


328

Để truy cập các tệp, các quyền phải được cấp trong tệp kê khai.

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

Thử cái 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, kỳ lạ là file.length cung cấp một NullPointerException ... bất kỳ ý tưởng nào? Spasibo!
Roger Travis

8
Tôi nghĩ rằng bạn không có tệp trong thư mục được chỉ định. Cố gắng kiểm tra tệp [] xem có rỗng không. Nếu nó là null thì bạn không có bất kỳ kết quả nào và file.length gây ra ngoại lệ.
Yury

4
Có vẻ như nó chỉ thiếu một "/" :) Cảm ơn!
Roger Travis

1
Làm việc như Charm! Điện thoại di động của tôi là Moto G4, Android N . Nếu ai đang phải đối mặt can't play video error. Bạn cần vào điện thoại di động của mình settings --> apps --> your app --> permissions --> enable storage. Nên làm điều này theo cách thủ công nếu bạn đang gặp phải lỗi này. Đảm bảo rằng bạn có <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />trong tệp kê khai của mình. Đối với những người đang gặp phải NullPointerException- bạn đang cố gắng truy cập các tệp trong bộ nhớ trong của ứng dụng. Đây là tệp riêng tư, rất tiếc bạn không thể làm điều đó.
coderpc

có cái gì giống như fileList (). clear ();? , Vì vậy tôi có thể tái sử dụng phương pháp này
user55924

44

Tôi vừa 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" />

đặt trong tệp AndroidManifest.xml của bạn.


6
Tôi biết đây là sự thật, nhưng ... Đây có phải là một câu trả lời? Hay nên là một bình luận?
Joaquin Iurchuk

7
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.
vt.

1
Nó cũng trả về null nếu thư mục rỗng
Hitesh Sahu

11

Chà, các AssetManagertệp này liệt kê các tệp trong assetsthư mục 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ụ của mình ở trên là [apk] / asset / sdcard / Pictures.

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

Mặt khác, nếu bạn có các tệp trên sdcard nằm ngoài tệp APK của bạn, trong Picturesthư mục, thì bạn sẽ sử dụng Filenhư vậy:

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

Và các liên kết có liên quan từ tài liệu: Trình quản lý nội dung
tệp


Cố gắng mà "File] ảnh [= file.listFiles ();", nhưng nó cũng đưa ra một NullPointException ... hmm ...
Roger Travis

1
Có vẻ như nó chỉ thiếu một "/" :) Cảm ơn!
Roger Travis

1
Cảm ơn vì đã cứu ngày của tôi :)
Syed Nazar Muhammad

@SyedNazarMuhammad Ha. Và cảm ơn bạn đã cứu tôi, bạn của tôi. Luôn tận hưởng một nhận xét tích cực: D
Reed

11

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

Nếu bạn đang sử dụng Android 6.0+ (API Cấp 23+), bạn phải yêu cầu rõ ràng quyền truy cập bộ nhớ ngoài. Đơn giản là 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 đã chủ động yêu cầu quyền trong hoạt động của mình:

//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 phần này: http://developer.android.com/training/permissions/requesting.html#perm-request


2

Của bạn pathkhông có trong thư mục nội dung. Bạn liệt kê các tệp trong thư mục nội dung bằng cách AssetManager.list()hoặc bạn liệt kê các tệp trên thẻ SD của mình bằng cáchFile.list()


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

hoặc là

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

1

Thử cái 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 có thể xảy ra:

  • Bạn không thêm READ_EXTERNAL_STORAGEquyền vàoAndroidManifest.xml
  • Bạn đang nhắm mục tiêu đến Android 23 và bạn không yêu cầu người dùng cấp quyền đó. Chuyển xuống Android 22 hoặc yêu cầu người dùng cấp quyền đó.

0

Thử những thứ này xem

 String appDirectoryName = getResources().getString(R.string.app_name);
    File directory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getResources().getString(R.string.app_name));
    directory.mkdirs();
    File[] fList = directory.listFiles();
    int a = 1;
    for (int x = 0; x < fList.length; x++) {

        //txt.setText("You Have Capture " + String.valueOf(a) + " Photos");
        a++;
    }
    //get all the files from a directory
    for (File file : fList) {
        if (file.isFile()) {
            list.add(new ModelClass(file.getName(), file.getAbsolutePath()));
        }
    }

0

Nếu bạn đang sử dụng Android 10 / Q và bạn đã làm tất cả những điều chính xác để yêu cầu quyền truy cập để đọc bộ nhớ ngoài và nó vẫn không hoạt động, thì bạn nên đọc câu trả lời này:

Android Q (10) yêu cầu quyền truy cập tất cả bộ nhớ. Bộ nhớ theo phạm vi

Tôi có mã đang hoạt động, nhưng thiết bị của tôi tự cập nhật khi có kết nối mạng (thường là không có kết nối.) Khi ở trong Android 10, quyền truy cập tệp không còn hoạt động. Cách dễ dàng duy nhất để khắc phục mà không cần viết lại mã là thêm thuộc tính bổ sung đó vào tệp kê khai như được mô tả. Quyền truy cập tệp hiện hoạt động lại như trong Android 9. YMMV, nó có thể sẽ không tiếp tục hoạt động trong các phiên bản sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.