本地文件系统.PERSISTENT指向哪里?

9
在 PhoneGap 中,我使用:
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);

访问文件系统。
在我的ASUS平板电脑上,它没有外部SD卡(我没有插入任何可移动设备),所以我认为文件系统根指向内部SD卡。然而,在我的HTC Desire HD上,数据被写入外部SD卡。(因为数据只驻留在microSD卡中。)
那么真相是什么?在W3C文档中找不到任何线索,也许我错过了什么......

PS:两个android版本都是ICS(冰淇淋三明治)。

1个回答

16
PhoneGap的FileAPI,虽然旨在模拟HTML5规范,但实际上是W3C文档的自定义实现。 您可以在此处找到与其API相关的文档。 尽管大部分情况下可以使用相同的方式,但在Web和设备上实现方式之间存在一些细微差别。存储位置就是其中之一。
为了了解PhoneGap如何处理持久存储,我不得不深入研究Cordova源代码。这个文件包含PhoneGap FileAPI使用的方法。 相关的代码块从第871行开始。基本上,API将调用Environment.getExternalStorageState()。如果返回Environment.MEDIA_MOUNTED,表示有一个可移动或不可移动的SD卡用于存储,则API返回的FileSystem是已挂载存储的根目录,使用Environment.getExternalStorageDirectory()。这解释了您在具有内部和外部SD卡的设备之间看到的行为差异,系统都认为它们是已挂载的外部存储。如果遇到没有外部存储的设备,即!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED),则返回的FileSystem的根目录将是内部存储中的"data/data/packageName",类似于调用Context.getFilesDir(),通常返回类似于"data/data/packageName/files"的内容。

1
你真是太棒了!但我有一个问题:第868行的代码fs.put("root", getEntry("/data/data/" + cordova.getActivity().getPackageName() + "/cache/"));的意思是系统会创建一个名为 /data/data/ +~ +/cache/ 的目录吗? 它是否像在Web上使用一样,为用户创建一个存储空间,而不是使用移动设备? - Alston
2
是的。特别是那一行是用于临时存储,因此他们创建了缓存目录来表示它。对于任何Android应用程序,PhoneGap或本机应用程序,“/data/data/packageName”都会被创建为该应用程序文件的私有空间。在这种情况下,PhoneGap只是利用该目录。 - MattDavis
1
如果您向下滚动此处的http://cordova.apache.org/#contribute,您可以找到每个平台的PhoneGap实现的源代码。我没有发现真正的指南,但是如果您查看http://docs.phonegap.com/en/2.7.0/index.html,您可以看到PhoneGap提供的不同API并尝试将文件与其功能配对。 - MattDavis
1
所以,内部存储实际上指的是"/data/data",任何额外的SD卡都被称为外部存储,无论其是否可移动(已安装在设备中且我们无法看到)。Sdcard 的名称是误导性的... - Alston
@MattDavis:你好,Github链接已失效。 - Abdul Rahman
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接