如何在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);
        }

但是,尽管我在该目录中确实有文件,但它会向我返回list.length = 0 ...有什么想法吗?

Answers:


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
谢谢Yury,奇怪的是file.length给出了NullPointerException ...任何想法吗?Spasibo!
罗杰·特拉维斯

8
我认为您在指定的文件夹中没有文件。尝试检查file []是否为空。如果为null,则没有任何结果,并且file.length导致异常。
尤里

4
似乎只是缺少一个“ /” :)谢谢!
罗杰·特拉维斯

1
像魅力一样工作!我的手机是Moto G4,AndroidN。如果有人面对can't play video error。您需要转到手机。settings --> apps --> your app --> permissions --> enable storage. 如果遇到此错误,请手动执行此操作。确保<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />清单中有。对于面对的人NullPointerException-您正试图访问应用程序内部存储中的文件,很抱歉,您不能这样做。
coderpc

是否有类似fileList()。clear();的东西?,因此我可以重用此方法
user55924

44

我刚刚发现:

new File("/sdcard/").listFiles() 如果没有,则返回null:

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

在您的AndroidManifest.xml文件中设置。


6
我知道这是事实,但是...这是答案吗?还是应该发表评论?
Joaquin Iurchuk

7
另外,在Android 6.0+上,需要在“设置”->“应用程序”->“您的应用程序”->“权限”中授予权限。
vt。

1
如果目录为空,它也将返回null
Hitesh Sahu's

11

好吧,AssetManager列表文件在assets您APK文件文件夹中的文件。因此,您想在上面的示例中列出的是[apk] / assets / sdcard / Pictures。

如果将一些图片放入assets应用程序的文件夹中,并且它们位于Pictures目录中,则可以mgr.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 []图片= file.listFiles();”,但是它也给出了NullPointException ... hmm ...
Roger Travis

1
似乎只是缺少一个“ /” :)谢谢!
罗杰·特拉维斯

1
感谢您保存我的一天:)
Syed Nazar Muhammad

@SyedNazarMuhammad Ha。谢谢你救我,我的朋友。总是很正面的评价: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



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,在将来的版本中可能无法继续使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.