Apache Commons FTP 未写入 FileOutputStream 且未抛出任何错误

Apache Commons FTP not writing to FileOutputStream with no error thrown

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

例程基本上 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());
        }

    }
  }

 }

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

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

索引的文件

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

所以,这意味着三件事:

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

  2. close()之后使用MediaScannerConnectionscanFile()来通知MediaStore新创建的文件,而不是等待文件在将来的任意时间自动编入索引。

  3. 如果您仍然遇到问题,请使用 DDMS 的文件浏览器或 adb shell 仔细检查文件是否存在,而不是仅仅依靠 MTP .