【问题标题】:FileTransfer "Saved file:" followed by FileNotFoundExceptionFileTransfer“保存的文件:”后跟 FileNotFoundException
【发布时间】: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 - 它显示了错误的路径,此时此路径无关紧要,因为在日志中找到的前两个路径匹配。

标签: java android cordova


【解决方案1】:

好的,某处有错误。我倾向于认为这是 getAbsolutePath() 中的错误,因为我在其他地方看到了一致的操作。

当我创建“文件更新”变量时,立即测试并记录 update.getAbsolutePath() - 它显示了正确的路径。但是当我尝试创建 FileInputStream 时,路径不同(+ /files/)

所以,稍微搜索了一下,我发现为了访问应用程序数据目录(没有 /files),我必须使用新的 File 命令发送一个不同的目录。这是它的样子:

File update = new File(ctx.getApplicationInfo().dataDir,"update.zip");

使用 getFilesDir() 获取目录

ctx.getFilesDir() = /data/data/com.yadda.yadda/files

获取正确的目录

ctx.getApplicationInfo().dataDir = /data/data/com.yadda.yadda

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2015-02-20
    • 1970-01-01
    • 2019-08-31
    相关资源
    最近更新 更多