Файл mkdirs() не работает в android/java

Я уже немного вытягиваю волосы на это. Предполагается, что следующий метод загрузит файл и сохранит его в указанном на жестком диске месте.

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) {

    if (!Tools.checkNetworkState(context, backgroundUpdate))
        return;

    // Get the image
    try {
        // Make the file
        file.getParentFile().mkdirs();

        // Set up the connection
        URLConnection uCon = url.openConnection();
        InputStream is = uCon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);

        // Download the data
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
                baf.append((byte) current);
        }

        // Write the bits to the file
        OutputStream os = new FileOutputStream(file);
        os.write(baf.toByteArray());
        os.close();
    } catch (Exception e) {
        // Any exception is probably a newtork faiilure, bail
        return;
    }
}

Кроме того, если файл не существует, он должен создать каталог для файла. (И если в этом месте есть еще один файл, он ничего не должен делать). Однако по какой-то причине метод mkdirs() никогда не создает каталог. Я пробовал все из явных круглых скобок, чтобы явно создать родительский класс файлов, и ничего не работает. Я вполне уверен, что диск доступен для записи, поскольку он только вызывается после того, как это уже определено, и это верно после выполнения его во время отладки. Таким образом, метод выходит из строя, потому что родительские каталоги не создаются. Может ли кто-нибудь сказать мне, если что-то не так с тем, как я его называю?

Кроме того, если это помогает, вот источник для файла, в который я его вызываю:

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

Спасибо

Ответ 1

Если вы пишете содержимое на SD-карте, надеясь, что вы добавили в свой манифест android.permission.WRITE_EXTERNAL_STORAGE

Ответ 2

Пожалуйста, проверьте это, это может помочь вам.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

введите разрешение в файл манифеста.

Ответ 3

В ответ на Kevin Day есть другой способ отказа, о котором не упоминалось в предыдущих сообщениях. Даже если у вас есть android.permission.WRITE_EXTERNAL_STORAGE в вашем манифесте, если вы пытаетесь записать на носитель, например /mnt/sdcard, который монтируется снаружи в качестве USB-устройства (т.е. Вы подключили свое устройство как внешний диск к компьютеру с помощью USB-кабель) в то время, когда вы пытаетесь выполнить запись, тогда вы не можете записать в файловую систему /mnt/sdcard. В этом случае FILE.mkdir вернет false. Очевидно, что если вы не проверяете код возврата, вы не увидите эту проблему, пока не получите IOException, если попытаетесь создать файл в каталоге, который, по вашему мнению, был создан. И если вы не создадите файл в этом несуществующем каталоге, то приложение будет просто терпеть неудачу.

Я постоянно делаю эту ошибку при отладке приложений для Android - забываю, что я не могу оба установить SD-карту извне и в то же время написать свое приложение.

Ответ 4

Вы уверены, что mkdirs не работает? Почему вы не проверяете возвращаемое значение вызова mkdirs и регистрируете сообщение об ошибке, если оно возвращает false?

if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){
  log("Unable to create " + file.getParentFile());
}

Я подозреваю, что вы можете быть удивлены тем, что было в файле...

PS - и, пожалуйста, сделайте что-нибудь с этим обработчиком ошибок - как минимум, запишите ошибку. Ловкое исключение и молчаливое возвращение - ужасная практика.