Extend FileUtils.delete with option to delete empty directories only
The new option EMPTY_DIRECTORIES_ONLY will make delete() only delete empty directories. Any attempt to delete files will fail. Can be combined with RECURSIVE to wipe out entire tree structures and IGNORE_ERRORS to silently ignore any files or non-empty directories. Change-Id: Icaa9a30e5302ee5c0ba23daad11c7b93e26b7445 Signed-off-by: Robin Stocker <robin@nibor.org>
This commit is contained in:
parent
13ea3b0957
commit
08d5ede281
|
@ -43,6 +43,8 @@
|
|||
|
||||
package org.eclipse.jgit.util;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.endsWith;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
@ -175,6 +177,7 @@ public void testMkdirs() throws IOException {
|
|||
assertTrue(f.delete());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateNewFile() throws IOException {
|
||||
File f = new File(trash, "x");
|
||||
FileUtils.createNewFile(f);
|
||||
|
@ -190,4 +193,47 @@ public void testCreateNewFile() throws IOException {
|
|||
FileUtils.delete(f);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteEmptyTreeOk() throws IOException {
|
||||
File t = new File(trash, "t");
|
||||
FileUtils.mkdir(t);
|
||||
FileUtils.mkdir(new File(t, "d"));
|
||||
FileUtils.mkdir(new File(new File(t, "d"), "e"));
|
||||
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE);
|
||||
assertFalse(t.exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteNotEmptyTreeNotOk() throws IOException {
|
||||
File t = new File(trash, "t");
|
||||
FileUtils.mkdir(t);
|
||||
FileUtils.mkdir(new File(t, "d"));
|
||||
File f = new File(new File(t, "d"), "f");
|
||||
FileUtils.createNewFile(f);
|
||||
FileUtils.mkdir(new File(new File(t, "d"), "e"));
|
||||
try {
|
||||
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE);
|
||||
fail("expected failure to delete f");
|
||||
} catch (IOException e) {
|
||||
assertThat(e.getMessage(), endsWith(f.getAbsolutePath()));
|
||||
}
|
||||
assertTrue(t.exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteNotEmptyTreeNotOkButIgnoreFail() throws IOException {
|
||||
File t = new File(trash, "t");
|
||||
FileUtils.mkdir(t);
|
||||
FileUtils.mkdir(new File(t, "d"));
|
||||
File f = new File(new File(t, "d"), "f");
|
||||
FileUtils.createNewFile(f);
|
||||
File e = new File(new File(t, "d"), "e");
|
||||
FileUtils.mkdir(e);
|
||||
FileUtils.delete(t, FileUtils.EMPTY_DIRECTORIES_ONLY | FileUtils.RECURSIVE
|
||||
| FileUtils.IGNORE_ERRORS);
|
||||
// Should have deleted as much as possible, but not all
|
||||
assertTrue(t.exists());
|
||||
assertTrue(f.exists());
|
||||
assertFalse(e.exists());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,6 +83,14 @@ public class FileUtils {
|
|||
*/
|
||||
public static final int IGNORE_ERRORS = 8;
|
||||
|
||||
/**
|
||||
* Option to only delete empty directories. This option can be combined with
|
||||
* {@link #RECURSIVE}
|
||||
*
|
||||
* @since 2.4
|
||||
*/
|
||||
public static final int EMPTY_DIRECTORIES_ONLY = 16;
|
||||
|
||||
/**
|
||||
* Delete file or empty folder
|
||||
*
|
||||
|
@ -126,7 +134,22 @@ public static void delete(final File f, int options) throws IOException {
|
|||
delete(c, options);
|
||||
}
|
||||
}
|
||||
if (!f.delete()) {
|
||||
|
||||
boolean delete = false;
|
||||
if ((options & EMPTY_DIRECTORIES_ONLY) != 0) {
|
||||
if (f.isDirectory()) {
|
||||
delete = true;
|
||||
} else {
|
||||
if ((options & IGNORE_ERRORS) == 0)
|
||||
throw new IOException(MessageFormat.format(
|
||||
JGitText.get().deleteFileFailed,
|
||||
f.getAbsolutePath()));
|
||||
}
|
||||
} else {
|
||||
delete = true;
|
||||
}
|
||||
|
||||
if (delete && !f.delete()) {
|
||||
if ((options & RETRY) != 0 && f.exists()) {
|
||||
for (int i = 1; i < 10; i++) {
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue