1

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

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

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

我错过了什么?

4

2 回答 2

2

这是一个很好的问题。首先,最好不要/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);

返回

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

希望这可以帮助。

于 2015-08-17T17:31:08.040 回答
2
"/data/data/com.mydomain.myapplicationname/files"

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

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

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

代码基本相同:

Context c = /*get your context here*/;
File path = new File(c.getFilesDir().getPath() + "/folder1/folder2/"); //this line changes
path.mkdirs();
于 2015-08-17T17:04:01.520 回答