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, Ключевое слово "в конце концов".

Итак, это означает три вещи:

  1. Пожалуйста позвони getFD().sync() на ваше FileOutputStream после flush() и раньше close(), Это гарантирует, что файлы будут записаны на диск перед продолжением.

  2. использование MediaScannerConnection а также scanFile() после close(), сказать MediaStore о вновь созданном файле, вместо того, чтобы ждать, пока файл будет автоматически проиндексирован в какое-то произвольное время в будущем.

  3. Если проблемы не исчезли, дважды проверьте их с помощью файлового менеджера DDMS или adb shell есть ли там файлы, а не полагаться исключительно на MTP.

Другие вопросы по тегам