2017-03-08 32 views
1

I次のコードがあります一覧隠しフォルダ内のファイルを除き、指定されたディレクトリ内を再帰的にすべてのファイル

Files.find(startPath, Integer.MAX_VALUE, (path, attributes) -> path.toFile().isFile()) 
      .map(p -> startPath.relativize(p).toString()).collect(Collectors.toList()); 

指定されたパス内の相対パスとファイル名のリストを返します。 私は何とかadditoinallyファイル構造のどこかに隠れたフォルダに配置されているすべてのファイルを除外に固執しています。助言がありますか?

+0

ストリームをフィルタリングしてファイルが非表示になっているかどうかを確認できますか? –

+0

@AndriiAbramov隠しファイルを無視するだけなので、これはうまくいきません。隠しディレクトリにあるファイルを無視するだけです – Moonlit

答えて

1

あなたが代わりにFiles.findのFiles.walkFileTreeを使用することができます。

List<String> files = new ArrayList<>(); 

Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, 
            BasicFileAttributes attr) 
    throws IOException { 
     if (attr.isRegularFile()) { 
      files.add(startPath.relativize(file).toString()); 
     } 
     return super.visitFile(file, attr); 
    } 

    @Override 
    public FileVisitResult preVisitDirectory(Path dir, 
              BasicFileAttributes attr) 
    throws IOException { 
     if (Files.isHidden(dir) || 
      (attr instanceof DosFileAttributes && 
       ((DosFileAttributes) attr).isHidden())) { 

      return FileVisitResult.SKIP_SUBTREE; 
     } 
     return super.preVisitDirectory(dir, attr); 
    } 
}); 

コードが長く見えますが、それはFiles.findよりも効率の低いません。

(DosFileAttributesの具体的な取扱いがそこにある理由あなたが迷っているならば、それはdocumentation for Files.isHidden状態ので、「それは、ディレクトリおよびDOS hidden属性が設定されていない場合、Windows上のファイルが隠されたと考えられている。」です)

1

次のことを試してみてください。

Files.find(startPath, Integer.MAX_VALUE, (path, attributes) -> path.toFile().isFile()) 
      .map(p -> startPath.relativize(p).toString()).collect(Collectors.toList()); 

を交換してください210

関連する問題