我正在使用 Hadoop 的 FileSystem
(org.apache.hadoop.fs.FileSystem
) 递归列出目录下的所有文件:
FileSystem.listFiles(new Path("file:/my/path"), true)
但是,我有一个递归符号链接(symbolic link) /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:/
路径。
最佳答案
一旦我需要递归地列出路径下的目录,我就根据 FileSystem.java 中 listFiles 的代码编写了自己的 listDirectories 函数。
如果你看一下代码,它非常简单,只是你应该避免在 FileStatus 上重复出现,如果它是一个符号链接(symbolic link)。但需要注意的是,您不会获得包含父符号链接(symbolic link)的路径。
你应该改变这个功能:
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());
}
}
关于java - 使用 Hadoop 的文件系统递归列出文件时跳过符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45346225/