3

例として、60日より古いディレクトリ(およびそのすべてのサブディレクトリ)の下にあるすべてのファイルをリストすることができる場所のDirecoryStream.Filter例を調査しようとしています。newDirectoryStream

DirectoryStream<Path> dirS = Files.newDirectoryStream(Paths.get("C:/myRootDirectory"), <DirectoryStream.filter>);

for (Path entry: dirS) {
    System.out.println(entry.toString());
}

上記のコードでは、DirectoryStream.filter?
特定のタイムスタンプよりも古いファイルを削除しようとしていて、Java 1.7より前のファイルFile.listFiles()がハングするプロジェクトにいるので、これは大きな助けになります。

Files.walkFileTree()オプションを提供できますか?

4

2 に答える 2

3

指定されたオブジェクトが 60 日より古い場合DirectoryStream.Filterに返される新しいインスタンスを作成するだけです。truePath

DirectoryStream<Path> dirStream = Files.newDirectoryStream(Paths.get("/some/path"), new Filter<Path>() {
    @Override
    public boolean accept(Path entry) throws IOException {
        FileTime fileTime = Files.getLastModifiedTime(entry);
        long millis = fileTime.to(TimeUnit.MILLISECONDS);
        Calendar today = Calendar.getInstance();
        // L is necessary for the result to correctly be calculated as a long 
        return today.getTimeInMillis() > millis + (60L * 24 * 60 * 60 * 1000);
    }
});

これは、指定されたディレクトリのルート内のファイルのみを提供することに注意してくださいPath。にPath渡される引数newDirectoryStream(..)

サブディレクトリにもすべてのファイルが必要な場合Files.walkFileTree(..)は、おそらく使いやすいでしょう。上記と同じロジックを使用して、途中で収集したオブジェクトのまたはをFileVisitor格納するを実装するだけです。ListSetPathFilter

于 2014-02-12T18:27:22.897 に答える