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".
所以,这意味着三件事:
请在 flush()
之后和 close()
之前在您的 FileOutputStream
上拨打 getFD().sync()
。这可确保在继续之前将文件写入磁盘。
在close()
之后使用MediaScannerConnection
和scanFile()
来通知MediaStore
新创建的文件,而不是等待文件在将来的任意时间自动编入索引。
如果您仍然遇到问题,请使用 DDMS 的文件浏览器或 adb shell
仔细检查文件是否存在,而不是仅仅依靠 MTP .
我在我们开发的 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".
所以,这意味着三件事:
请在
flush()
之后和close()
之前在您的FileOutputStream
上拨打getFD().sync()
。这可确保在继续之前将文件写入磁盘。在
close()
之后使用MediaScannerConnection
和scanFile()
来通知MediaStore
新创建的文件,而不是等待文件在将来的任意时间自动编入索引。如果您仍然遇到问题,请使用 DDMS 的文件浏览器或
adb shell
仔细检查文件是否存在,而不是仅仅依靠 MTP .