Skip to content

Commit 1e8b502

Browse files
committed
IO-727: fix directoryContains() handling files with the same prefix
1 parent 8c5d235 commit 1e8b502

3 files changed

Lines changed: 36 additions & 6 deletions

File tree

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ public static String concat(final String basePath, final String fullFileNameToAd
518518
/**
519519
* Determines whether the {@code parent} directory contains the {@code child} element (a file or directory).
520520
* <p>
521-
* The files names are expected to be normalized.
521+
* The files names are expected to be canonical.
522522
* </p>
523523
*
524524
* Edge cases:
@@ -541,15 +541,21 @@ public static boolean directoryContains(final String canonicalParent, final Stri
541541
throws IOException {
542542
Objects.requireNonNull(canonicalParent, "canonicalParent");
543543

544-
if (canonicalChild == null) {
544+
if (canonicalChild == null || canonicalChild.isEmpty() || canonicalParent.isEmpty()) {
545545
return false;
546546
}
547547

548548
if (IOCase.SYSTEM.checkEquals(canonicalParent, canonicalChild)) {
549549
return false;
550550
}
551551

552-
return IOCase.SYSTEM.checkStartsWith(canonicalChild, canonicalParent);
552+
final char separator = canonicalParent.charAt(0) == UNIX_SEPARATOR ? UNIX_SEPARATOR : WINDOWS_SEPARATOR;
553+
final String parentWithEndSeparator =
554+
canonicalParent.charAt(canonicalParent.length() - 1) == separator
555+
? canonicalParent
556+
: canonicalParent + separator;
557+
558+
return IOCase.SYSTEM.checkStartsWith(canonicalChild, parentWithEndSeparator);
553559
}
554560

555561
/**

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,16 @@ public void testSameFile() throws IOException {
134134
}
135135

136136
@Test
137-
public void testIO466() throws IOException {
138-
final File fooFile = new File(directory1.getParent(), "directory1.txt");
139-
assertFalse(FileUtils.directoryContains(directory1, fooFile));
137+
public void testFileHavingSamePrefixBug() throws IOException {
138+
final File foo = new File(top, "foo");
139+
final File foobar = new File(top, "foobar");
140+
final File fooTxt = new File(top, "foo.txt");
141+
foo.mkdir();
142+
foobar.mkdir();
143+
FileUtils.touch(fooTxt);
144+
145+
assertFalse(FileUtils.directoryContains(foo, foobar));
146+
assertFalse(FileUtils.directoryContains(foo, fooTxt));
140147
}
141148

142149
@Test

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,4 +1193,21 @@ public void testIsExtensionCollection() {
11931193
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT"))));
11941194
assertFalse(FilenameUtils.isExtension("a.b\\file.txt", new ArrayList<>(Arrays.asList("TXT", "RTF"))));
11951195
}
1196+
1197+
//-----------------------------------------------------------------------
1198+
@Test
1199+
public void testDirectoryContains() throws IOException {
1200+
assertTrue(FilenameUtils.directoryContains("/foo", "/foo/bar"));
1201+
assertTrue(FilenameUtils.directoryContains("/foo/", "/foo/bar"));
1202+
assertTrue(FilenameUtils.directoryContains("C:\\foo", "C:\\foo\\bar"));
1203+
assertTrue(FilenameUtils.directoryContains("C:\\foo\\", "C:\\foo\\bar"));
1204+
1205+
assertFalse(FilenameUtils.directoryContains("/foo", "/foo"));
1206+
assertFalse(FilenameUtils.directoryContains("/foo", "/foobar"));
1207+
assertFalse(FilenameUtils.directoryContains("C:\\foo", "C:\\foobar"));
1208+
assertFalse(FilenameUtils.directoryContains("/foo", null));
1209+
assertFalse(FilenameUtils.directoryContains("", ""));
1210+
assertFalse(FilenameUtils.directoryContains("", "/foo"));
1211+
assertFalse(FilenameUtils.directoryContains("/foo", ""));
1212+
}
11961213
}

0 commit comments

Comments
 (0)