【问题标题】:How to list files in an android directory?如何列出android目录中的文件?
【发布时间】:2012-01-28 15:20:26
【问题描述】:

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

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... 有什么想法吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    为了访问这些文件,必须在清单文件中提供权限。

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

    【讨论】:

    • 谢谢 Yury,奇怪的是 file.length 给出了 NullPointerException ......有什么想法吗?斯帕西博!
    • 我认为您的指定文件夹中没有文件。尝试检查文件 [] 是否为空。如果它为 null,那么您没有任何结果,并且 file.length 会导致异常。
    • 看来只是少了一个“/” :) 谢谢!
    • 像魅力一样工作!我的手机是 Moto G4,Android N。如果有人面对can't play video error。您需要转到您的手机settings --&gt; apps --&gt; your app --&gt; permissions --&gt; enable storage. 如果您遇到此错误,应手动执行此操作。确保清单中有&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;。对于面临NullPointerException 的人 - 您正在尝试访问应用程序内部存储中的文件,这些文件是私有的,抱歉您不能这样做。
    • 有类似 fileList().clear(); 的东西吗? ,所以我可以重用这个方法
    【解决方案2】:

    我刚刚发现:

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

    &lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;

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

    【讨论】:

    • 我知道这是事实,但是……这是一个答案吗?还是应该是评论?
    • 此外,在 Android 6.0+ 上,需要在 Settings->Apps->Your app->Permissions 中授予权限。
    • 如果 Directory 为空,它也返回 null
    【解决方案3】:

    好吧,AssetManager 列出了您的 APK 文件内的 assets 文件夹中的文件。因此,您要在上面的示例中列出的是 [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
    Asset Manager

    【讨论】:

    • 试过“File[] Pictures = file.listFiles();”,但它也给出了 NullPointException...嗯...
    • 看来只是少了一个“/” :) 谢谢!
    • 感谢您拯救我的一天 :)
    • @SyedNazarMuhammad Ha。谢谢你救了我的,我的朋友。总是享受积极的评价:D
    【解决方案4】:

    除了以上所有答案:

    如果您使用的是 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

    【讨论】:

      【解决方案5】:

      更新工作方法

      我的 minSdkversion 是 21,所以我使用ContextCompat.checkSelfPermission() 方法来授予权限除了,还可以在清单中添加&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&gt;。因此,尽管目标目录中有文件,但要摆脱 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-------------------------*/
         }
      
      
      以及列出所有文件的函数(在 MainActivity.java 中),感谢@Yury:-
      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");
          }
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:
          String[] listOfFiles = getActivity().getFilesDir().list();
          

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

          【讨论】:

            【解决方案8】:

            试试这个:

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

            【讨论】:

              【解决方案9】:

              可能会发生两件事:

              • 您没有将READ_EXTERNAL_STORAGE 权限添加到您的AndroidManifest.xml
              • 您的目标是 Android 23,并且您没有向用户请求该权限。转到 Android 22 或请求用户授予该权限。

              【讨论】:

                【解决方案10】:

                试试这些

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

                【讨论】:

                  【解决方案11】:

                  如果您使用的是 Android 10/Q,并且您做了所有正确的事情来请求访问权限以读取外部存储,但仍然无法正常工作,那么值得一读这个答案:

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

                  我有工作代码,但我的设备在网络连接时自行更新(通常没有连接。)进入 Android 10 后,文件访问不再有效。在不重写代码的情况下修复它的唯一简单方法是按照所述将额外属性添加到清单中。文件访问现在再次像在 Android 9 中一样工作。 YMMV,它可能不会在以后的版本中继续工作。

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                    • 您可能应该参考@Yury 的原始、已接受的答案,因为您已复制其中的 90% 并简单地添加了 Android 10 的更新。
                    • 作为贡献者,我是堆栈溢出的新手,我遇到了这个问题,并认为他的答案不完整,所以发布了这个。如果人们觉得它没有帮助,我会等待更多关于它的观点我会删除它,thanx mate你的观点感谢它!
                    • 如果您说 Yuri 的回答需要针对较新版本的 Android 进行一些详细说明,我认为您的回答是可以的。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-06-13
                    • 1970-01-01
                    • 2020-01-29
                    • 2012-12-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-03-07
                    相关资源
                    最近更新 更多