【问题标题】:Can't create directory with mkdirs() - android无法使用 mkdirs() 创建目录 - android
【发布时间】:2017-04-20 04:55:52
【问题描述】:

我尝试创建一个目录并使用以下代码:

boolean success = true;
String rootDirectory = Environment.getExternalStorageDirectory().toString();
folder = new File(rootDirectory, "Directory");
if(!(folder.exists())) {
     success = folder.mkdirs();
} else {

}

if(success) {
   Toast.makeText(getActivity().getApplicationContext(), "DIR created", Toast.LENGTH_SHORT).show();     
} else {
     Toast.makeText(getActivity().getApplicationContext(), "DIR not created successfully", Toast.LENGTH_SHORT).show();
}

我也搜索过创建的文件夹,没有。

已授予权限:

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

我也尝试在运行时请求权限,似乎该应用已获得权限,因此不是问题。

几个月前,我创建了另一个应用程序并使用了相同的代码和相同的 SDK 版本,但它仍然不能与这个应用程序一起使用。我得到“DIR not created successfully”,我不知道为什么,请帮我弄清楚为什么我不能创建目录。

【问题讨论】:

标签: android file mkdir mkdirs


【解决方案1】:

要求Manifest.permission.WRITE_EXTERNAL_STORAGE 对于 Android 10+ 来说已经不够用了。现在您还可以在清单中启用对旧版外部存储的访问:

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

【讨论】:

    【解决方案2】:

    使用下面的代码

    File directory = new File(Environment.getExternalStorageDirectory() + java.io.File.separator +"Directory");
    if (!directory.exists())
            Toast.makeText(getActivity(), 
              (directory.mkdirs() ? "Directory has been created" : "Directory not created"),
            Toast.LENGTH_SHORT).show(); 
    else
         Toast.makeText(getActivity(), "Directory exists", Toast.LENGTH_SHORT).show();
    

    对于 Android API 23 (Marshmallow) 及更高版本,我们必须允许 dangerous permissions 否则我们的代码将无法按预期工作。

    【讨论】:

    • 我使用了您的确切代码,但它仍然无法正常工作。我得到了“未创建目录”的祝酒词
    • gradle 文件中可能有什么东西可以中断目录的创建?
    • 您有WRITE_EXTERNAL_STORAGE 权限吗?我不是在谈论清单文件中的权限声明。我是说你有写的权限吗?
    • 我尝试了运行时:int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    • 只需进入您的应用设置并允许写入 sd 卡权限并重新运行您的应用
    【解决方案3】:

    在新的Android更新API 30你只能写在你的应用本地文件app-specific files

    File dir = new File(context.getFilesDir(), "YOUR_DIR");
    dir.mkdirs();
    

    或在您的应用程序的外部存储中Android/data

    final File dir = new File(myContext.getExternalFilesDir("FolderName"),"YOUR_DIR");
    

    更新

    这个答案提供了另一个解决方案https://stackoverflow.com/a/65744517/8195076

    更新

    另一种方法是在manifest 中授予此权限

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

    喜欢这个答案https://stackoverflow.com/a/66968986/8195076

    【讨论】:

      【解决方案4】:
      String path = Environment.getExternalStorageDirectory().toString() + "/" +"MyDir";
      File dir = new File(path);
      if(!dir.exists())
      {
          dir.mkdirs()
      }
      

      【讨论】:

      • 此代码似乎不起作用,它无法解析“存在”。
      • 很抱歉它的 file.exists()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2014-04-06
      • 2018-02-06
      相关资源
      最近更新 更多