Skip to content

Commit a463f1e

Browse files
author
Gary Gregory
committed
FileUtils.listFiles() does not list matching files if File parameter is
a symbolic link.
1 parent 8381e95 commit a463f1e

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ The <action> type attribute can be add,update,fix,remove.
7777
<action issue="IO-726" dev="ggregory" type="fix" due-to="shollander, Gary Gregory">
7878
Add MemoryMappedInputStream. #215.
7979
</action>
80+
<action issue="IO-749" dev="ggregory" type="fix" due-to="haihuiyang, Gary Gregory">
81+
FileUtils.listFiles() does not list matching files if File parameter is a symbolic link.
82+
</action>
8083
<!-- ADD -->
8184
<action dev="ggregory" type="add" due-to="Gary Gregory">
8285
Add BrokenReader.INSTANCE.

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@
5555
import java.util.Collection;
5656
import java.util.Collections;
5757
import java.util.Date;
58+
import java.util.HashSet;
5859
import java.util.Iterator;
5960
import java.util.List;
6061
import java.util.Objects;
62+
import java.util.Set;
6163
import java.util.stream.Collectors;
6264
import java.util.stream.Stream;
6365
import java.util.zip.CRC32;
@@ -2175,13 +2177,15 @@ public static LineIterator lineIterator(final File file, final String charsetNam
21752177
}
21762178

21772179
private static AccumulatorPathVisitor listAccumulate(final File directory, final IOFileFilter fileFilter,
2178-
final IOFileFilter dirFilter) throws IOException {
2180+
final IOFileFilter dirFilter, FileVisitOption... options) throws IOException {
21792181
final boolean isDirFilterSet = dirFilter != null;
21802182
final FileEqualsFileFilter rootDirFilter = new FileEqualsFileFilter(directory);
21812183
final PathFilter dirPathFilter = isDirFilterSet ? rootDirFilter.or(dirFilter) : rootDirFilter;
21822184
final AccumulatorPathVisitor visitor = new AccumulatorPathVisitor(Counters.noopPathCounters(), fileFilter,
21832185
dirPathFilter);
2184-
Files.walkFileTree(directory.toPath(), Collections.emptySet(), toMaxDepth(isDirFilterSet), visitor);
2186+
Set<FileVisitOption> optionSet = new HashSet<>();
2187+
Collections.addAll(optionSet, options);
2188+
Files.walkFileTree(directory.toPath(), optionSet, toMaxDepth(isDirFilterSet), visitor);
21852189
return visitor;
21862190
}
21872191

@@ -2237,7 +2241,7 @@ private static File[] listFiles(final File directory, final FileFilter fileFilte
22372241
public static Collection<File> listFiles(
22382242
final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter) {
22392243
try {
2240-
final AccumulatorPathVisitor visitor = listAccumulate(directory, fileFilter, dirFilter);
2244+
final AccumulatorPathVisitor visitor = listAccumulate(directory, fileFilter, dirFilter, FileVisitOption.FOLLOW_LINKS);
22412245
return visitor.getFileList().stream().map(Path::toFile).collect(Collectors.toList());
22422246
} catch (final IOException e) {
22432247
throw UncheckedIOExceptions.create(directory, e);
@@ -2284,7 +2288,7 @@ public static Collection<File> listFiles(final File directory, final String[] ex
22842288
public static Collection<File> listFilesAndDirs(
22852289
final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter) {
22862290
try {
2287-
final AccumulatorPathVisitor visitor = listAccumulate(directory, fileFilter, dirFilter);
2291+
final AccumulatorPathVisitor visitor = listAccumulate(directory, fileFilter, dirFilter, FileVisitOption.FOLLOW_LINKS);
22882292
final List<Path> list = visitor.getFileList();
22892293
list.addAll(visitor.getDirList());
22902294
return list.stream().map(Path::toFile).collect(Collectors.toList());

0 commit comments

Comments
 (0)