Java 7 でディレクトリ ツリーを移動する場合は、Paths
andFiles
機能を使用します。ディレクトリとファイルの読み取りを容易にするだけでなく、「古い」方法よりもはるかに高速ですFile
。
2 つのディレクトリがあるとします: mainDir
andと のすべてのディレクトリをそのリーフまでotherDir
たどりたいとします。(ファイル、サブディレクトリ、シンボリック リンク、...)mainDir
内の各エントリを使用して、このエントリとその属性 (サイズ、変更時間など) を .xml ファイル内の同じ位置にあるエントリと比較します。次に、これはあなたのコードになります:maiondir
otherDir
public final void test() throws IOException, InterruptedException {
final Path mainDir = Paths.get("absolute path to your main directory to read from");
final Path otherDir = Paths.get("absolute path to your other directory to compare");
// Walk thru mainDir directory
Files.walkFileTree(mainDir, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path path,
BasicFileAttributes atts) throws IOException {
return visitFile(path, atts);
}
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts)
throws IOException {
// I've seen two implementations on windows and MacOSX. One has passed the relative path, one the absolute path.
// This works in both cases
Path relativePath = mainDir.relativize(mainDir.resolve(path));
BasicFileAttributes otherAtts = Files.readAttributes(otherDir.resolve(relativePath), BasicFileAttributes.class);
// Do your comparison logic here:
compareEntries(mainDir, otherDir, relativePath, mainAtts, otherAtts);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path path,
IOException exc) throws IOException {
// TODO Auto-generated method stub
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path path, IOException exc)
throws IOException {
exc.printStackTrace();
// If the root directory has failed it makes no sense to continue
return (path.equals(mainDir))? FileVisitResult.TERMINATE:FileVisitResult.CONTINUE;
}
});
}
しないこと:
otherDir
に存在するが存在しないエントリを検索maindir
Path
とは でBasicFileAttributes
はないSerializable
ため、2 つの異なるマシンでこのウォークを実行する簡単な方法はありません。