2017-07-27 66 views
0

我使用Hadoop的FileSystemorg.apache.hadoop.fs.FileSystem)递归列出所有的目录下的文件:跳过符号链接而递归地列出文件使用Hadoop的文件系统

FileSystem.listFiles(new Path("file:/my/path"), true) 

不过,我有一个递归符号链接/my/path/symlink -> /my/pathlistFiles回报一个巨大的路径列表如

/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:/

回答

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()); 
    } 
    }