Я пытаюсь разархивировать папку в 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, и это приводит к ошибке.