【问题标题】:Directory & File Creation on Android File SystemAndroid 文件系统上的目录和文件创建
【发布时间】:2012-08-22 05:45:07
【问题描述】:

我正在尝试创建目录层次结构,然后将文件从我的资产复制到新创建的目录中。我已经在 stackoverflow 上使用了此处提供的代码示例,但我没有得到任何结果。基本上我的代码是这样的:

InputStream in = getAssets.open(mydb.sqlite);
File dir = new File("/data/data/my.package/databases/");

dir.mkdirs();
out = new FileOutputStream("/data/data/my.package/databases/mydb.sqlite");
while ((len = in.read(buffer)) > 0)
{
    out.write(buffer, 0, len);
}
out.flush();
out.close();
in.close

这一切都是在第一次启动时在主要活动中完成的,当然应该只完成一次。在代码运行之前,唯一存在的目录是 /data/。是的,它是一个数据库文件,但此时这无关紧要,因为我只是在复制文件,还没有尝试使用数据库代码访问它。

代码不会抛出任何异常,并且 dir.mkdirs() 返回 true。无论如何,不​​会创建目录并且不会复制文件。我已将 WRITE_EXTERNAL_STORAGE 的权限行添加到我的清单中,正如 FWIW 几个地方所建议的那样。我可以单步执行代码,一切似乎都很好。但当然不是。

我需要在这里寻找什么?文件权限问题?为什么代码认为一切都在那里(即,当它到达复制代码时,它不会抛出 FileNotFoundException)但实际上文件系统上什么都没有?

编辑:这是我学到的。 getDir() 在 /data/data/my.package/app_* 中创建目录。不知道为什么它在目录名称上使用这个前缀。如果您需要将某些内容放在标准位置,例如数据库/或文件/,这将不起作用。

【问题讨论】:

    标签: java android io filesystems


    【解决方案1】:

    请改用 openFileOutput,因为 /data/data 是内部存储,您应该只使用 Android API 在那里获取文件句柄。见:http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

    编辑: /data/data/my.package 由 openFileOutput/getDir 处理,因此您可以使用 getDir('databases',MODE_PRIVATE) 创建目录并在那里创建文件。

    编辑2: 来自 getDir 文档:

    您可以使用返回的 File 对象在此目录中创建和访问文件。

    【讨论】:

    • 除此之外,您不需要 WRITE_EXTERNAL_STORAGE 权限即可写入 /data/data/ 目录
    • 根据文档, openFileOutput() 不接受文件名参数中的路径分隔符。 getDir() 具有相同的限制。我需要将目录设置为 /data/data/my.package/databases/ 因为这是 SQLiteOpenHelper 期望找到数据库的地方。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2016-11-13
    • 2015-01-31
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多