Получение случайных сбоев mkdirs в ExternalFilesDir - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь разархивировать папку в getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS). У некоторых пользователей редко возникают ошибки разархивирования случайной подпапки. Это происходит после того, как другие подпапки zip были успешно распакованы, поэтому для меня это не имеет смысла.

У меня уже есть android.permission.WRITE_EXTERNAL_STORAGE в манифесте, хотя это разрешение не требуется для этого каталога, так как Kitkat.

private Boolean unzipFile(String zipFilePath) throws ObservableException {
        File destinationDir = new File(zipFilePath.substring(0, zipFilePath.lastIndexOf(".")));

        try (ZipFile zip = new ZipFile(zipFilePath)) {
            if (!destinationDir.exists() && !destinationDir.mkdirs()) {
                throw new ObservableException(" destination root folder could not be created and ");
            }
            Enumeration<? extends ZipEntry> zipFileEntries = zip.entries();
            while (zipFileEntries.hasMoreElements()) {
                ZipEntry entry = zipFileEntries.nextElement();
                String entryName = entry.getName();
                File destFile = new File(destinationDir, entryName);
                File destinationParent = destFile.getParentFile();
                createDir(destinationParent);
                if (!destinationParent.canWrite()) {
                    throw new ObservableException("cannot write in this directory");
                }
                if (!entry.isDirectory()) {
                    extractFile(zip, entry, destFile);
                } else {
                    File dir = new File(destFile.getAbsolutePath());
                    createDir(dir);
                }
            }
        } catch (Exception e) {
        ...
        } finally {
            File zipFile = new File(zipFilePath);
            if (zipFile.delete()) {
                Log.d(TAG, zipFilePath + " deleted");
            }
        }
        return true;
    }


    private void createDir(File path) throws ObservableException, IOException {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createDirectories(Paths.get(path.getPath()));
        } else {
            if (!path.exists() && !path.mkdirs()) {
                throw new ObservableException(" folder could not be created");
            }
        }
    }

В createDir () предложение if (! Path.exists () &&! Path.mkdirs ()) иногда имеет значение true, и это приводит к ошибке.

...