【发布时间】:2014-02-07 07:21:00
【问题描述】:
我的应用从远程网络服务器下载一个 zip 文件,然后将其解压缩。
javascript成功调用FileTransfer,记录如下:
FileTransfer Saved file: file:///data/data/com.yadda.yadda/update.zip
作为成功函数的一部分,javascript 调用我的自定义更新插件,该插件会立即测试文件:
Context ctx = this.cordova.getActivity().getBaseContext();
File update = new File(ctx.getFilesDir(),"update.zip");
if(!update.exists()) Log.w("File not found",update.getAbsolutePath());
最后一行的日志是:
File Not Found /data/data/com.yadda.yadda/update.zip
稍后在 try/catch 块中,我创建了一个 InputStream 变量,其中一个 catch 块是每次都会触发的 FileNotFoundException。
开始编辑 - 更多信息
FileNotFoundException 有一个有趣的地方。文件路径错误 - 即使我发送相同的“更新”变量来创建 FileInputStream
InputStream fileis = new FileInputStream(update);
还有一个有趣的例外:
Caused by: java.io.FileNotFoundException: /data/data/com.yadda.yadda/files/update.zip
结束编辑
这里出了什么问题? Cordova 记录文件传输完成并且文件已保存,但是当我测试它时该文件不存在!我创建FileInputStream时,为什么路径不一样,导致异常?
我错过了什么?在 IOS 版本的应用中一切正常。
编辑 2:根据请求,我浏览了设备文件系统,发现 update.zip 确实存在于 /data/user/0/com.yadda.yadda
【问题讨论】:
-
您展示了如何测试文件位置,而不是首先如何设置保存文件位置。在我看来,返回正确位置的
getFilesDir()似乎不是您保存文件的位置,这从文件传输日志中也可以清楚地看到。你是如何设置这个的 -///data/data/com.yadda.yadda/update.zip? -
javascript 与您的应用有什么关系?下载 zip 后 Filetransfer 必须做什么?你提到了两条不同的路径。
-
要清楚,
/data/data/com.yadda.yadda/files/是getFilesDir()返回的正确位置。因此,问题在于您没有向我们展示的文件传输。因此,无法回答您的问题。换句话说,//data/data/com.yadda.yadda/不是存储文件的正确位置。 -
@simon,getFilesDir() 正在返回“/data/data/com.yadda.yadda”,第一个 Log.w 显示在 update..getAbsolutePath() 返回的路径中。
-
@simon,我会处理这个问题,谢谢。 FileTransfer 的日志输出(cordova 插件生成第一个日志,而不是我)显示了保存文件的路径。我的 Log.w(上面显示的第二个日志)显示了我正在搜索文件的路径 - 请注意它们是相同的路径。当我尝试使用相同的 File 变量创建 InputStream 时,会生成 FileNotFoundException - 它显示了错误的路径,此时此路径无关紧要,因为在日志中找到的前两个路径匹配。