Android निर्देशिका में फ़ाइलों को कैसे सूचीबद्ध करें?


120

यहाँ मेरा कोड अब तक है:

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 में फाइलें हैं, तो वह मुझे list.length = 0 ... कोई विचार देता है?

जवाबों:


328

फ़ाइलों तक पहुँचने के लिए, अनुमतियाँ प्रकट फ़ाइल में दी जानी चाहिए।

<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
धन्यवाद यूरी, अजीब ढंग से file.length एक NullPointerException देता है ... कोई विचार? Spasibo!
रोजर ट्रैविस

8
मुझे लगता है कि आपके पास निर्दिष्ट फ़ोल्डर में फाइलें नहीं हैं। नल के लिए फ़ाइल [] की जाँच करने का प्रयास करें। यदि यह अशक्त है, तो आपके पास कोई परिणाम नहीं है और फ़ाइल.लिफ्टर अपवाद का कारण बनता है।
यूरी

4
लगता है कि यह सिर्फ एक "/" याद कर रहा था :) धन्यवाद!
रोजर ट्रैविस

1
आकर्षण की तरह काम किया! मेरा मोबाइल Moto G4, Android N है । अगर किसी को सामना करना पड़ रहा है can't play video errorsettings --> apps --> your app --> permissions --> enable storage. यदि आप इस त्रुटि का सामना कर रहे हैं, तो आपको अपने मोबाइल पर जाना चाहिए। सुनिश्चित करें कि <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />आपके सामने आपके पास मौजूद है। जो लोग सामना NullPointerExceptionकर रहे हैं - आप ऐप के आंतरिक स्टोरेज में उन फ़ाइलों को एक्सेस करने की कोशिश कर रहे हैं जो निजी खेद है कि आप ऐसा नहीं कर सकते।
कोडरपीसी

वहाँ फ़ाइललिस्ट की तरह कुछ है ()। स्पष्ट (?) , इसलिए मैं इस विधि का पुन: उपयोग कर सकता
हूं

44

मुझे अभी पता चला है कि:

new File("/sdcard/").listFiles() यदि आपके पास नहीं है तो अशक्त लौटाता है:

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

अपने AndroidManifest.xml फ़ाइल में सेट करें।


6
मुझे पता है कि यह सच है, लेकिन ... क्या यह जवाब है? या टिप्पणी होनी चाहिए?
जोक्विन इराचुक

7
इसके अलावा, एंड्रॉइड 6.0+ पर सेटिंग्स-> ऐप्स-> आपका ऐप-> अनुमतियां में अनुमति दी जानी चाहिए।
वीटी।

1
यदि निर्देशिका खाली है तो यह भी अशक्त हो जाती है
हितेश साहू

11

खैर, AssetManagerसूचियों को उस assetsफ़ोल्डर के भीतर फाइल करता है जो आपकी एपीके फाइल के अंदर है। तो क्या आप ऊपर दिए गए उदाहरण में सूचीबद्ध करने का प्रयास कर रहे हैं [apk] / आस्तियों / sdcard / चित्र।

यदि आप assetsअपने एप्लिकेशन के अंदर फ़ोल्डर में कुछ चित्र रखते हैं , और वे Picturesनिर्देशिका में थे , तो आप करेंगेmgr.list("/Pictures/")

दूसरी ओर, यदि आपके पास sdcard पर फ़ाइलें हैं जो आपकी एपीके फ़ाइल के बाहर हैं, Picturesफ़ोल्डर में, तो आप Fileनिम्न कार्य करेंगे:

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

और डॉक्स से प्रासंगिक लिंक:
फ़ाइल
एसेट मैनेजर


कोशिश की है कि "फ़ाइल [] चित्र = file.listFiles ()?", लेकिन यह भी एक NullPointException ... हम्म ...
रोजर ट्रैविस

1
लगता है कि यह सिर्फ एक "/" याद कर रहा था :) धन्यवाद!
रोजर ट्रैविस

1
मेरा दिन बचाने के लिए धन्यवाद :)
सैयद नज़र मुहम्मद

@ सैयदअनज़रमुहम्मद हा। और मेरा, मेरे दोस्त को बचाने के लिए धन्यवाद। हमेशा सकारात्मक टिप्पणी का आनंद लें: D
Reed

11

उपरोक्त सभी उत्तरों के अतिरिक्त:

यदि आप एंड्रॉइड 6.0+ (एपीआई स्तर 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-reestest


2

आपकी pathसंपत्ति एसेट फ़ोल्डर में नहीं है। या तो आप एसेट्स फोल्डर के भीतर फाइलों को एनुमरेट करते हैं AssetManager.list()या आप अपने एसडी कार्ड पर फाइलों को एन्युमरेट करते हैं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

यदि आप एंड्रॉइड 10 / Q पर हैं और आपने बाहरी भंडारण को पढ़ने के लिए एक्सेस अनुमतियों का अनुरोध करने के लिए सभी सही चीजें की हैं और यह अभी भी काम नहीं करता है, तो यह जवाब पढ़ने के लायक है:

Android Q (10) सभी स्टोरेज को एक्सेस करने की अनुमति मांगता है। भंडारण को बंद कर दिया

मेरे पास वर्किंग कोड था, लेकिन नेटवर्क कनेक्शन पर होने पर (अपडेट आमतौर पर यह बिना कनेक्शन के होता था) अपडेट करने के लिए डिवाइस ने इसे अपने आप में ले लिया। एंड्रॉइड 10 में एक बार, फ़ाइल एक्सेस अब काम नहीं करती। कोड को फिर से लिखने के बिना इसे ठीक करने का एकमात्र आसान तरीका उस अतिरिक्त विशेषता को प्रकट रूप में जोड़ना था। फ़ाइल एक्सेस अब Android 9 में फिर से काम करती है। YMMV, यह शायद भविष्य के संस्करणों में काम करना जारी नहीं रखेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.