我正在使用Hadoop的FileSystem
(org.apache.hadoop.fs.FileSystem
)以递归方式列出目录下的所有文件:
FileSystem.listFiles(new Path("file:/my/path"), true)
但是,我有一个递归符号链接/my/path/symlink -> /my/path
,listFiles
返回一个巨大的路径列表,如
/my/path/symlink
/my/path/symlink/symlink
/my/path/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink/symlink
...
是否有标志或配置参数来阻止这种情况?
我需要使用FileSystem
因为我同时使用hdfs:/
和file:/
路径。
答案 0 :(得分:1)
一旦我需要在路径下递归列出目录,我就会根据FileSystem.java中listFiles的代码编写自己的listDirectories函数。
如果查看代码,它非常简单,只要你是一个符号链接就应该避免在FileStatus上重复出现。但需要注意的是,你不会得到包含父符号链接的路径。
你应该改变这个功能:
private void handleFileStat(LocatedFileStatus stat) throws IOException {
if (stat.isFile()) { // file
curFile = stat;
} else if (recursive) { // directory
itors.push(curItor);
curItor = listLocatedStatus(stat.getPath());
}
}
类似于:
private void handleFileStat(LocatedFileStatus stat) throws IOException {
if (stat.isFile()) { // file
curFile = stat;
} else if (recursive && !stat.isSymlink()) { // directory and not symlink
itors.push(curItor);
curItor = listLocatedStatus(stat.getPath());
}
}