【问题标题】:Apache Commons FTP not writing to FileOutputStream with no error thrownApache Commons FTP 未写入 FileOutputStream 且未引发错误
【发布时间】:2015-06-11 22:14:37
【问题描述】:

我在我们开发的一个 android 应用程序中使用 apache commons 库。这是遗留代码,出于某种原因,它没有写入设备。这发生在多个设备上,因此它不是特定于设备的。我们使用的是运行 Android 4.4 的 Nexus 7 设备。

该例程基本上是通过 FTP 传输到我们的服务器并查找要下载的新图像。 FTP到服务器成功,没有问题。

String listOfFiles = "GE_PT17_image.png,GE_PT18_image.png,GE_PT39_image.png";
String devicePathName = "/mnt/sdcard/company_name/DRMHH/"
status = ftpConnect(args[2], args[0], args[1], 21);
mFTPClient.changeWorkingDirectory(pathname);

FTPFile[] files = mFTPClient.listFiles();

我们基本上是查看服务器上目录中的所有图片,然后将它们与想要的图片进行匹配:

for (int i = 0; i < files.length; i++) {
    if (files[i].isDirectory()) {
                            ;

    } else {
    ///mnt/sdcard/company_name/DRMHH/

   if (listOfFiles.toUpperCase().contains(files[i].getName().toUpperCase())) {
        File file = new File(devicePathName + File.separator + files[i].getName());
        Log.d("FileName", devicePathName + File.separator + files[i].getName());
        try {
            FileOutputStream fos = new FileOutputStream(file); //NO ERROR or EXCEPTION
            boolean weAreOK = mFTPClient.retrieveFile(files[i].getName(), fos); //returns true
            fos.flush();
            fos.close();
        } catch (Exception e) {
                Log.d("File Exception", e.toString());
        }

    }
  }

 }

在设备上找不到应该下载的文件。返回文件是否成功检索的变量返回 true。就像我说的,这是已经存在多年的遗留代码,直到现在都没有问题。有人有想法么?

【问题讨论】:

  • “在设备上找不到应该下载的文件”——您如何确定这一点?您没有使用 MediaScannerConnectionscanFile(),因此这些文件在一段时间内不会通过 USB 连接显示。如果您无法使用 adb 找到它们,请尝试在 fos 之后 flush()close() 之前调用 getFD().sync()。而且我不知道您从哪里获得args[4] 的值,但如果这不是来自ContextEnvironment 上的方法(例如,它是硬编码的),那也可能是麻烦的来源.
  • 我正在使用 USB 连接到设备。我从来不用等文件出现之前。
  • 我编辑了 arg[4] 的值——我调试的时候是对的。

标签: android ftp apache-commons


【解决方案1】:

自 Android 3.0 起,通过 USB 连接使用的协议是媒体传输协议 (MTP)。 Android 通过 MTP 提供的文件不是文件系统上的文件,而是MediaStore 索引的文件。

您在外部存储上创建的文件最终将被索引并添加到​​MediaStore。关键词是“最终”。

所以,这意味着三件事:

  1. 请在flush() 之后和close() 之前在您的FileOutputStream 上致电getFD().sync()。这可确保在继续之前将文件写入磁盘。

  2. 1234563 /p>
  3. 如果您仍然遇到问题,请使用 DDMS 的文件资源管理器或 adb shell 仔细检查文件是否存在,而不是仅仅依靠 MTP。

【讨论】:

  • 是的,通过 adb 检查显示图像确实在设备上。非常感谢您周到的回答。 +1
  • @KristyWelsh:另一个问题是开发机器上的 MTP 客户端软件。 MTP 协议假定设备没有创建新文件。因此,MTP for Android 似乎没有任何方法可以告诉桌面操作系统“嘿,嗯,你能更新你的目录列表吗?”。您可能需要在桌面文件管理器中进行某种“刷新”,甚至拔下并重新插入 USB 电缆,以显示文件。严格来说,这不是 Android 的错,而只是 MTP、AFAICT 的限制。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2014-07-29
  • 1970-01-01
  • 2011-10-02
  • 2016-11-23
相关资源
最近更新 更多