Файл метод mkdirs () не работает в Android / Java - PullRequest
11 голосов
/ 28 декабря 2010

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

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

Спасибо

Ответы [ 4 ]

30 голосов
/ 28 декабря 2010

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

13 голосов
/ 28 декабря 2010

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

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

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

5 голосов
/ 28 марта 2013

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

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

3 голосов
/ 28 декабря 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...