Android dizinindeki dosyalar nasıl listelenir?


120

Şimdiye kadarki kodum:

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

Yine de bu dizinde dosyalarım varken, bana list.length = 0 ... herhangi bir fikir veriyor mu?

Yanıtlar:


329

Dosyalara erişim için izinlerin manifest dosyasında verilmesi gerekir.

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

Bunu dene:

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
Teşekkürler Yury, garip bir şekilde file.length bir NullPointerException veriyor ... herhangi bir fikir? Spasibo!
Roger Travis

8
Belirtilen klasörde dosyalarınız olmadığını düşünüyorum. Null için [] dosyasını kontrol etmeyi deneyin. Boş ise, herhangi bir sonucunuz yoktur ve file.length istisnaya neden olur.
Yury

4
Görünüşe göre bir "/" eksik :) Teşekkürler!
Roger Travis

1
Charm gibi çalıştı! Benim cep Moto G4 olduğunu Android N . Karşılaşan varsa can't play video error. settings --> apps --> your app --> permissions --> enable storage. Bu hatayla karşılaşırsanız , cep telefonunuza gitmeniz gerekir . Bildiriminizde bulunduğunuzdan emin olun <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />. Karşılaşan insanlar için NullPointerException- uygulamanın dahili belleğindeki özel dosyalara erişmeye çalışıyorsunuz, üzgünüm bunu yapamazsınız.
coderpc

fileList (). clear () gibi bir şey var mı? , bu yüzden bu yöntemi yeniden kullanabilirim
user55924

44

Bunu yeni keşfettim:

new File("/sdcard/").listFiles() şuna sahip değilseniz null döndürür:

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

AndroidManifest.xml dosyanızda ayarlayın.


6
Bunun doğru olduğunu biliyorum ama ... Bu bir cevap mı? Yoksa yorum mu olmalı?
Joaquin Iurchuk

7
Ek olarak, Android 6.0+ üzerinde izinlerin Ayarlar-> Uygulamalar-> Uygulamanız-> İzinler bölümünde verilmesi gerekir.
vt.

1
Dizin boşsa da boş döndürür
Hitesh Sahu

11

Peki, APK dosyanızın içindeki klasördeki AssetManagerdosyaları listeler assets. Yani yukarıdaki örneğinizde listelemeye çalıştığınız şey [apk] / assets / sdcard / Pictures'dır.

assetsUygulamanızın içindeki klasöre bazı resimler koyarsanız ve bunlar Picturesdizinde olsaydı, yapardınız mgr.list("/Pictures/").

Öte yandan, sdcard'da APK dosyanızın dışında, Picturesklasörde dosyalarınız varsa, şu şekilde kullanırsınız File:

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

Ve belgelerden ilgili bağlantılar:
Dosya
Varlık Yöneticisi


"File [] pictures = file.listFiles ();" denedim, ancak aynı zamanda bir NullPointException da veriyor ... hmm ...
Roger Travis

1
Görünüşe göre bir "/" eksik :) Teşekkürler!
Roger Travis

1
Günümü kurtardığın için teşekkürler :)
Syed Nazar Muhammad

@SyedNazarMuhammad Ha. Ve benimkini kurtardığın için teşekkürler dostum. Her zaman olumlu bir yorum yapın: D
Reed

11

Yukarıdaki tüm cevaplara ek olarak:

Android 6.0+ (API Düzeyi 23+) kullanıyorsanız, harici depolamaya erişmek için açıkça izin istemeniz gerekir. Sadece sahip olmak

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

senin tezahüründe yeterli olmayacak. Ayrıca etkinliğinizde aktif olarak izin talep ettiniz:

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

Bunu okumanızı tavsiye ederim: http://developer.android.com/training/permissions/requesting.html#perm-request


2

Öğeniz pathvarlıklar klasöründe değil. Varlıklar klasöründeki AssetManager.list()dosyaları ya ile numaralandırırsınız ya da SD kartınızdaki dosyaları şu şekilde numaralandırırsınız:File.list()


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

veya

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

1

Bunu dene:

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

Olabilecek iki şey var:

  • READ_EXTERNAL_STORAGEİzin eklemiyorsunuzAndroidManifest.xml
  • Android 23'ü hedefliyorsunuz ve kullanıcıya bu izni istemiyorsunuz. Android 22'ye gidin veya kullanıcıdan bu izni isteyin.

0

Bunları dene

 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 kullanıyorsanız ve harici depolamayı okumak için erişim izinleri istemek için tüm doğru şeyleri yaptıysanız ve hala çalışmıyorsa, şu cevabı okumaya değer:

Android Q (10) tüm depolama alanına erişmek için izin istiyor. Kapsamlı depolama

Çalışan kodum vardı, ancak cihazım bir ağ bağlantısındayken güncelleme yapmak için kendi üzerine aldı (genellikle bağlantı yoktu.) Android 10'a girdikten sonra, dosya erişimi artık çalışmıyordu. Kodu yeniden yazmadan düzeltmenin tek kolay yolu, bu fazladan özniteliği açıklandığı gibi bildirime eklemekti. Dosya erişimi artık yine Android 9'daki gibi çalışıyor. YMMV, muhtemelen gelecekteki sürümlerde çalışmaya devam etmeyecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.