Apache Commons FTP не пишет в FileOutputStream без выданной ошибки
Я использую библиотеку Apache Commons в приложении для Android, которое мы разработали. Это устаревший код, и по какой-то причине он не записывается на устройство. Это происходит на нескольких устройствах, поэтому это не зависит от конкретного устройства. Мы используем устройства 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());
}
}
}
}
На устройстве не было найдено файлов, которые предположительно были загружены. Переменная, возвращающая, был ли файл успешно получен, возвращает true. Как я уже сказал, это устаревший код, который существовал годами и до сих пор работал без проблем. У кого-нибудь есть идеи?
1 ответ
Протокол, используемый через соединение USB, начиная с Android 3.0, является протоколом передачи мультимедиа (MTP). Файлы, обслуживаемые Android через MTP, - это не то, что находится в файловой системе, а то, что индексируется MediaStore
,
Файлы, которые вы создаете на внешнем хранилище, в конечном итоге будут проиндексированы и добавлены в MediaStore
, Ключевое слово "в конце концов".
Итак, это означает три вещи:
Пожалуйста позвони
getFD().sync()
на вашеFileOutputStream
послеflush()
и раньшеclose()
, Это гарантирует, что файлы будут записаны на диск перед продолжением.использование
MediaScannerConnection
а такжеscanFile()
послеclose()
, сказатьMediaStore
о вновь созданном файле, вместо того, чтобы ждать, пока файл будет автоматически проиндексирован в какое-то произвольное время в будущем.Если проблемы не исчезли, дважды проверьте их с помощью файлового менеджера DDMS или
adb shell
есть ли там файлы, а не полагаться исключительно на MTP.