Apache Commons FTP没有写入FileOutputStream而没有抛出错误

时间:2015-06-11 22:14:37

标签: android ftp apache-commons

我在我们开发的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。就像我说的,这是遗留代码已经存在多年,直到现在没有任何问题。有人有主意吗?

1 个答案:

答案 0 :(得分:1)

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

您在外部存储上创建的文件最终会被编入索引并添加到​​MediaStore。关键词是&#34;最终&#34;。

所以,这意味着三件事:

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

  2. MediaScannerConnection之后使用scanFile()close()告诉MediaStore新创建的文件,而不是等待文件自动编入索引将来任意一段时间。

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