【问题标题】:Android MKDirs() not working for me - NOT EXTERNAL StorageAndroid MKDirs() 不适合我 - 不是外部存储
【发布时间】:2015-11-10 09:51:04
【问题描述】:

我已阅读有关此的各种其他帖子,但尚未找到适合我的答案。他们一直在讨论使用外部存储,我需要使用“默认”(内部)存储。

我的一个活动例程中有一个非常简单的例程

String PATH = "/data/data/com.mydomain.myapplicationname/files";
SystemIOFile.MkDir(PATH);  // Ensure Recipient Path Exists

然后在我的 SystemIOFile 类中我有

static public Boolean MkDir(String directoryName) 
  {
    Boolean isDirectoryFound = false;
    File Dir = new File(directoryName);
    if(Dir.isDirectory())
    {
      isDirectoryFound = true;
    } else {
      Dir.mkdirs();
      if (Dir.isDirectory()) 
      {
         isDirectoryFound = true;
      }
  }
  Dir = null;
  return isDirectoryFound;
}

在我的 Android.Manifest.xml 我有

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

因此,似乎所有部件都已准备就绪,可以正常工作。

但它不起作用。
当我单步执行 MKDir() 例程时,它总是失败。

if (Dir.isDirectory())

总是返回 false
而后面的 Dir.mkdirs() 总是返回 false

我错过了什么?

【问题讨论】:

标签: java android mkdirs


【解决方案1】:

这是一个很好的问题。 首先,最好不要直接引用/sdcard 路径。请改用Environment.getExternalStorageDirectory().getPath()。 其次,假设您想要访问自己应用的文件 - 您也不想直接引用 /data/data 路径,因为它在多用户场景中会有所不同。请改用Context.getFilesDir().getPath()

实施上述,我们看到:

String PATH = "/data/data/com.mydomain.myapplicationname/files";
SystemIOFile.MkDir(PATH);

返回 false,而:

String PATH = Environment.getExternalStorageDirectory().getPath() 
        + getApplicationContext().getFilesDir().getPath();
SystemIOFile.MkDir(PATH);

返回 true

另请注意,您忽略了 Boolean MkDir(String directoryName) 内的 Dir.mkdirs() 的结果。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。如果根据上面其他人所说的,/data/data/ 目录不是外部存储位置,则不会基于 Environment.getExternalStorageDirectory() 设置 PATH。 getPath() 将我指向错误的位置?
  • /data/data 不是外部存储位置,但例如 /storage/emulated/0/data/data
  • 再次感谢您的回复。既然您说 /data/data 不是外部存储位置,并且因为这是我不想更改的应用程序中当前使用的目录位置,我该如何去做目录(或确保它已经被制作)?
  • 实际上/data/data 是您设备内部存储的一部分,所有应用程序都安装在其中。除非您有根设备,否则您无法直接浏览它。至于它指向哪里,它只是指向你内部存储的一部分。
  • 再次感谢您的回复。我不想浏览目录。相反,我需要以编程方式确保它存在,以便我可以将一个或多个下载的文件保存到其中 - 以供应用程序本身稍后检索。
【解决方案2】:
"/data/data/com.mydomain.myapplicationname/files"

不是外部存储路径。您需要做的是获取应用程序分配的存储路径。

Context c = /*get your context here*/;
File path = new File(c.getExternalFilesDir().getPath() + "/folder1/folder2/");
path.mkdirs();

如果您需要访问应用程序的内部文件空间(前提是访问该空间的应用程序拥有它),那么您可以使用ContextgetFilesDir()。这将返回应用的内部存储位置。

代码基本相同:

Context c = /*get your context here*/;
File path = new File(c.getFilesDir().getPath() + "/folder1/folder2/"); //this line changes
path.mkdirs();

【讨论】:

  • 感谢您的回复。我的任务是对现有的 Android 应用程序进行修改,而该目录是他们已经在使用的目录 - 所以我犹豫要更改它。如果不是外部存储区,如何获取需要的目录?
  • 我建议使用 File 对象而不是 String: File path = new File(c.getExternalFilesDir(), "/folder1/folder2/");
  • @Dhugalmac 我很确定在内部存储中修改任何不是你的东西都是“非法的”(在外部存储上,我相信这是公平的游戏)
  • @Jeeter - Android 应用程序是我们公司的应用程序。以前的开发者已经不在了。我不想破坏已经工作的部分 - 只需添加新功能。作为 Android 开发的新手,我想了解如何使用已经存在的目录结构(和位置)。
  • @TedHopp - 我不是已经在 MkDir() 函数中使用了 File 对象吗?
猜你喜欢
  • 2011-11-04
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多