Skip to content

Commit 5754cc5

Browse files
authored
[IO-874] FileUtils.forceDelete can delete a broken symlink again (#756)
* [IO-874] FileUtils.forceDelete can delete a broken symlink again. * [IO-874] fix checkstyle error
1 parent 50b972f commit 5754cc5

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/main/java/org/apache/commons/io/FileUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public static String byteCountToDisplaySize(final Number size) {
294294
*/
295295
private static void checkExists(final File file, final boolean strict) throws FileNotFoundException {
296296
Objects.requireNonNull(file, PROTOCOL_FILE);
297-
if (strict && !file.exists()) {
297+
if (strict && !file.exists() && !isSymlink(file)) {
298298
throw new FileNotFoundException(file.toString());
299299
}
300300
}

src/test/java/org/apache/commons/io/FileUtilsTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,42 @@ void testForceDeleteUnwritableFile() throws Exception {
17611761
}
17621762
}
17631763

1764+
@Test
1765+
public void testForceDeleteBrokenSymlink() throws Exception {
1766+
final ImmutablePair<Path, Path> pair = createTempSymbolicLinkedRelativeDir();
1767+
final Path symlinkedDir = pair.getLeft();
1768+
final Path targetDir = pair.getRight();
1769+
1770+
Files.delete(targetDir);
1771+
assertFalse(Files.exists(symlinkedDir));
1772+
assertTrue(Files.isSymbolicLink(symlinkedDir));
1773+
1774+
FileUtils.forceDelete(symlinkedDir.toFile());
1775+
1776+
// check targeted symlink is gone
1777+
assertFalse(Files.exists(symlinkedDir));
1778+
assertFalse(Files.isSymbolicLink(symlinkedDir));
1779+
}
1780+
1781+
@Test
1782+
public void testForceDeleteSymlink() throws Exception {
1783+
final ImmutablePair<Path, Path> pair = createTempSymbolicLinkedRelativeDir();
1784+
final Path symlinkedDir = pair.getLeft();
1785+
final Path targetDir = pair.getRight();
1786+
1787+
assertTrue(Files.exists(symlinkedDir));
1788+
assertTrue(Files.isSymbolicLink(symlinkedDir));
1789+
assertTrue(Files.exists(targetDir));
1790+
1791+
FileUtils.forceDelete(symlinkedDir.toFile());
1792+
1793+
// check targeted symlink is gone
1794+
assertFalse(Files.exists(symlinkedDir));
1795+
assertFalse(Files.isSymbolicLink(symlinkedDir));
1796+
// dir targeted by symlink is not deleted
1797+
assertTrue(Files.exists(targetDir));
1798+
}
1799+
17641800
@Test
17651801
void testForceMkdir() throws Exception {
17661802
// Tests with existing directory

0 commit comments

Comments
 (0)