如何列出android目录中的文件?

时间:2011-12-27 16:41:02

标签: android

到目前为止,这是我的代码:

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 ...任何想法?

12 个答案:

答案 0 :(得分:278)

试试这个:

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

答案 1 :(得分:39)

我刚刚发现:

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

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

在AndroidManifest.xml文件中设置。

答案 2 :(得分:10)

好的,AssetManager列出了APK文件中assets文件夹中的文件。所以你在上面的例子中列出的是[apk] / assets / sdcard / Pictures。

如果您将一些图片放在应用程序内的assets文件夹中,并且它们位于Pictures目录中,您将执行mgr.list("/Pictures/")

另一方面,如果您的APK文件之外的文件位于Pictures文件夹中,那么您可以使用File

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

来自文档的相关链接:
File
Asset Manager

答案 3 :(得分:9)

除上述所有答案外:

如果您使用的是Android 6.0+(API Level 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

答案 4 :(得分:2)

您的path不在资源文件夹中。您可以通过AssetManager.list()枚举assets文件夹中的文件,或者通过File.list()

枚举SD卡上的文件

答案 5 :(得分:1)

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

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

答案 6 :(得分: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());
    }

}

}

答案 7 :(得分:1)

有两件事情可能发生:

  • 您没有向READ_EXTERNAL_STORAGE
  • 添加AndroidManifest.xml权限
  • 您的目标是Android 23,而您并未向用户请求该权限。下载到Android 22或要求用户提供该权限。

答案 8 :(得分:1)

更新的工作方法

我的minSdkversion是21,所以我正在使用ContextCompat.checkSelfPermission()方法授予权限,同时在清单中添加了<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>。因此,尽管目标目录中有文件,但要摆脱NullPointerException,请按以下方式授予权限:-

MainActivity.java


public class MainActivity extends AppCompatActivity {
    /*Other variables & constants here*/  
    private final int READ_EXTERNAL_STORAGE=100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ignore the button code

        Button btn = (Button) findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openWebView();
            }
        });
    

         /*---------------------------- GRANT PERMISSIONS START-------------------------*/
        // Main part to grant permission. Handle other cases of permission denied
       //   yourself.
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},READ_EXTERNAL_STORAGE);

         /*---------------------------- GRANT PERMISSIONS OVER-------------------------*/
   }

借助@Yury,列出所有文件的函数(在MainActivity.java中):-
public void getDownloadedFile() {
        String path = Environment.getExternalStorageDirectory().toString()+"/Download/";
        Log.d("Files", "Path: " + path);
        File directory = new File(path);
        File[] files = directory.listFiles();
        if(directory.canRead() && files!=null) {
            Log.d("Files", "Size: " + files.length);
            for(File file: files)
                Log.d("FILE",file.getName());
        }
        else
            Log.d("Null?", "it is null");
    }

答案 9 :(得分: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()));
        }
    }

答案 10 :(得分:0)

如果您使用的是Android 10 / Q,并且您已执行所有正确的操作来请求访问权限以读取外部存储,但仍然无法使用,则值得阅读以下答案:

Android Q (10) ask permission to get access all storage. Scoped storage

我有工作代码,但我的设备依靠网络连接(通常没有连接)自行更新。一旦在Android 10中,文件访问就不再起作用。无需重写代码即可解决此问题的唯一简便方法是,按照所述将额外的属性添加到清单中。现在,文件访问再次可以在Android 9中进行。 YMMV,在将来的版本中可能无法继续使用。

答案 11 :(得分:0)

Yury 的回答需要针对较新版本的 Android 进行一些详细说明。

首先,确保在清单文件中定义了READ_EXTERNAL_STORAGE权限。

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

包括以下内容,对于大于或等于 Android 10(Q) 的 SDK。

<application android:requestLegacyExternalStorage="true"...</application>

现在您可以列出目录中的文件。

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