测试两个目录树是否相等

2022-09-02 13:42:02

我正在集成测试我的代码的某些部分,这些代码在SVN下创建目录树。这需要我测试目录结构和其中的文件是否是我所期望的。

一方面,我有预期的目录树,其中包含我想要的文件,另一方面,从SVN导出文件(为了避免噪音,我更喜欢)。svn exportsvn co.svn

但是,是否有任何库可以断言两个目录树?我想到的最后一种方法是自己做一个迭代比较。

基本上,我正在寻找一个API,它可以只接受两个目录,并告诉我它们是否相等。

一些东西在行

boolean areDirectoriesEqual(File dir1, File dir2)

答案 1

我不是在使用第三方库,而是使用标准的jdk库。

private static void verifyDirsAreEqual(Path one, Path other) throws IOException {
    Files.walkFileTree(one, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file,
                BasicFileAttributes attrs)
                throws IOException {
            FileVisitResult result = super.visitFile(file, attrs);

            // get the relative file name from path "one"
            Path relativize = one.relativize(file);
            // construct the path for the counterpart file in "other"
            Path fileInOther = other.resolve(relativize);
            log.debug("=== comparing: {} to {}", file, fileInOther);

            byte[] otherBytes = Files.readAllBytes(fileInOther);
            byte[] theseBytes = Files.readAllBytes(file);
            if (!Arrays.equals(otherBytes, theseBytes)) {
                throw new AssertionFailedError(file + " is not equal to " + fileInOther);
            }  
            return result;
        }
    });
}

注意:这只是比较两个文件夹下的实际文件。如果你有空文件夹等,你也想比较,你可能需要做一些额外的事情。


答案 2

我不知道有任何图书馆;我能想到的最接近的是Commons FileUtils中的listFiles方法。areDirsEqual

如果将生成的集合放在 中,则应该能够有效地比较这两个集合。它可以在2行中完成,甚至可以是一行。HashSet

这条线上的东西:

public static boolean areDirsEqual(File dir, File dir2) {
  return (new HashSet<File>(FileUtils.listFiles(dir1,..))).
          containsAll(FileUtils.listFiles(dir2, ..))
}

推荐