วิธีแสดงรายการไฟล์ในไดเรกทอรี Android


121

นี่คือรหัสของฉันจนถึงตอนนี้:

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);
        }

แต่ในขณะที่ฉันมีไฟล์อยู่ใน dir นั้นมันจะส่งกลับรายการความยาว = 0 ...

คำตอบ:


329

ในการเข้าถึงไฟล์ต้องให้สิทธิ์ในไฟล์รายการ

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

ลองสิ่งนี้:

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
ขอบคุณ Yury file.length ที่แปลกประหลาดให้ NullPointerException ... มีความคิดอย่างไร Spasibo!
Roger Travis

8
ฉันคิดว่าคุณไม่มีไฟล์ในโฟลเดอร์ที่ระบุ ลองตรวจสอบไฟล์ [] เพื่อหาค่าว่าง หากเป็นโมฆะคุณจะไม่มีผลลัพธ์ใด ๆ และ file.length ทำให้เกิดข้อยกเว้น
ยูรี

4
ปรากฏว่ามันหายไปแค่ "/" :) ขอบคุณ!
Roger Travis

1
ทำงานเหมือน Charm! โทรศัพท์มือถือของฉันคือ Moto G4, Android N หากใครที่กำลังเผชิญcan't play video errorอยู่ คุณต้องไปที่มือถือของคุณsettings --> apps --> your app --> permissions --> enable storage. ควรทำด้วยตนเองหากคุณพบข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณมี<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />อยู่ในไฟล์ Manifest สำหรับผู้ที่กำลังเผชิญหน้าNullPointerException- คุณกำลังพยายามเข้าถึงไฟล์ในที่จัดเก็บข้อมูลภายในของแอปซึ่งเป็นข้อมูลส่วนตัวขออภัยที่คุณไม่สามารถทำได้
coderpc

มีบางอย่างเช่น fileList (). clear ();? ดังนั้นฉันสามารถใช้วิธีนี้ซ้ำได้
user55924

44

ฉันเพิ่งค้นพบว่า:

new File("/sdcard/").listFiles() ส่งคืนค่าว่างหากคุณไม่มี:

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

ตั้งค่าในไฟล์ AndroidManifest.xml ของคุณ


6
ฉันรู้ว่านี่คือความจริง แต่ ... นี่คือคำตอบ? หรือควรเป็นความคิดเห็น?
Joaquin Iurchuk

7
นอกจากนี้ใน Android 6.0+ จะต้องให้สิทธิ์ในการตั้งค่า -> แอป -> แอปของคุณ -> สิทธิ์
vt.

1
นอกจากนี้ยังส่งคืนค่าว่างหาก Directory ว่างเปล่า
Hitesh Sahu

11

Well, AssetManagerไฟล์รายการภายในassetsโฟลเดอร์ที่อยู่ภายในของไฟล์ APK ของคุณ ดังนั้นสิ่งที่คุณพยายามแสดงในตัวอย่างด้านบนคือ [apk] / assets / sdcard / Pictures

หากคุณใส่ภาพบางส่วนภายในassetsในโฟลเดอร์ของแอพลิเคชันของคุณและพวกเขาอยู่ในไดเรกทอรีที่คุณจะทำPicturesmgr.list("/Pictures/")

ในทางกลับกันหากคุณมีไฟล์ใน sdcard ที่อยู่นอกไฟล์ APK ของคุณในไฟล์ Picturesโฟลเดอร์คุณจะใช้Fileดังนี้:

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

และลิงก์ที่เกี่ยวข้องจากเอกสาร:
File
Asset Manager


พยายามที่ "File [] pictures = file.listFiles ();" แต่ก็ให้ NullPointException ด้วย ... อืม ...
Roger Travis

1
ปรากฏว่ามันหายไปแค่ "/" :) ขอบคุณ!
Roger Travis

1
ขอบคุณที่ช่วยวันของฉัน :)
Syed Nazar Muhammad

มาม่า และขอขอบคุณสำหรับการช่วยชีวิตของฉันเพื่อนของฉัน เพลิดเพลินกับคำพูดเชิงบวกเสมอ: D
Reed

11

นอกเหนือจากคำตอบทั้งหมดข้างต้น:

หากคุณใช้ Android 6.0+ (API ระดับ 23+) คุณต้องขออนุญาตอย่างชัดเจนเพื่อเข้าถึงที่เก็บข้อมูลภายนอก เพียงแค่มี

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

ในรายการของคุณจะไม่เพียงพอ คุณยังได้ขออนุญาตในกิจกรรมของคุณ:

//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);
}

ฉันแนะนำให้อ่านสิ่งนี้: http://developer.android.com/training/permissions/requesting.html#perm-request


2

ของคุณpathไม่ได้อยู่ในโฟลเดอร์สินทรัพย์ ไม่ว่าคุณจะแจกแจงไฟล์ในโฟลเดอร์ assets โดยใช้AssetManager.list()หรือระบุไฟล์ในการ์ด SD ของคุณด้วยวิธีการFile.list()


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

หรือ

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

1

ลองสิ่งนี้:

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

มีสองสิ่งที่อาจเกิดขึ้น:

  • คุณไม่ได้เพิ่มREAD_EXTERNAL_STORAGEสิทธิ์ในไฟล์AndroidManifest.xml
  • คุณกำหนดเป้าหมายเป็น Android 23 และคุณไม่ได้ขออนุญาตผู้ใช้นั้น ลงไปที่ Android 22 หรือขออนุญาตจากผู้ใช้

0

ลองสิ่งเหล่านี้

 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

หากคุณใช้ Android 10 / Q และคุณทำทุกอย่างถูกต้องเพื่อขอสิทธิ์การเข้าถึงเพื่ออ่านที่จัดเก็บข้อมูลภายนอก แต่ยังใช้งานไม่ได้คุณควรอ่านคำตอบนี้:

Android Q (10) ขออนุญาตเพื่อเข้าถึงที่เก็บข้อมูลทั้งหมด การจัดเก็บแบบกำหนดขอบเขต

ฉันมีรหัสที่ใช้งานได้ แต่อุปกรณ์ของฉันใช้มันเพื่ออัปเดตเมื่อมันอยู่บนการเชื่อมต่อเครือข่าย (โดยปกติจะไม่มีการเชื่อมต่อ) เมื่ออยู่ใน Android 10 การเข้าถึงไฟล์จะไม่ทำงานอีกต่อไป วิธีง่ายๆเพียงวิธีเดียวในการแก้ไขโดยไม่ต้องเขียนโค้ดใหม่คือการเพิ่มแอตทริบิวต์พิเศษนั้นในรายการตามที่อธิบายไว้ ตอนนี้การเข้าถึงไฟล์ใช้งานได้เหมือนใน Android 9 อีกครั้ง YMMV อาจใช้งานไม่ได้ในเวอร์ชันอนาคต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.