AVD Mananger: Fix the deletion of a folder content.
Bug: 2364917
Change-Id: I9585200adad5deb2ef27ea157ddd25e7124c2e73
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
index 9499798..0713e74 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
@@ -487,7 +487,11 @@
if (removePrevious) {
// AVD already exists and removePrevious is set, try to remove the
// directory's content first (but not the directory itself).
- recursiveDelete(avdFolder);
+ try {
+ deleteContentOf(avdFolder);
+ } catch (SecurityException e) {
+ log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
+ }
} else {
// AVD shouldn't already exist if removePrevious is false.
log.error(null,
@@ -712,8 +716,12 @@
log.warning("Removing previous AVD directory at %s", oldAvdInfo.getPath());
// Remove the old data directory
File dir = new File(oldAvdInfo.getPath());
- recursiveDelete(dir);
- dir.delete();
+ try {
+ deleteContentOf(dir);
+ dir.delete();
+ } catch (SecurityException e) {
+ log.error(e, "Failed to delete %1$s", dir.getAbsolutePath());
+ }
}
return newAvdInfo;
@@ -721,14 +729,20 @@
log.error(e, null);
} catch (IOException e) {
log.error(e, null);
+ } catch (SecurityException e) {
+ log.error(e, null);
} finally {
if (needCleanup) {
if (iniFile != null && iniFile.exists()) {
iniFile.delete();
}
- recursiveDelete(avdFolder);
- avdFolder.delete();
+ try {
+ deleteContentOf(avdFolder);
+ avdFolder.delete();
+ } catch (SecurityException e) {
+ log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
+ }
}
}
@@ -896,8 +910,7 @@
f = new File(path);
if (f.exists()) {
log.printf("Deleting folder %1$s\n", f.getCanonicalPath());
- recursiveDelete(f);
- if (!f.delete()) {
+ if (deleteContentOf(f) == false || f.delete() == false) {
log.error(null, "Failed to delete %1$s\n", f.getCanonicalPath());
error = true;
}
@@ -918,6 +931,8 @@
log.error(e, null);
} catch (IOException e) {
log.error(e, null);
+ } catch (SecurityException e) {
+ log.error(e, null);
}
return false;
}
@@ -991,13 +1006,20 @@
*
* @throws SecurityException like {@link File#delete()} does if file/folder is not writable.
*/
- public void recursiveDelete(File folder) {
+ private boolean deleteContentOf(File folder) throws SecurityException {
for (File f : folder.listFiles()) {
if (f.isDirectory()) {
- recursiveDelete(folder);
+ if (deleteContentOf(f) == false) {
+ return false;
+ }
}
- f.delete();
+ if (f.delete() == false) {
+ return false;
+ }
+
}
+
+ return true;
}
/**