如何遍历目录中的所有RAR存档。我知道如何遍历目录中的文件,但我只对RAR存档感兴趣。如果它们是扩展名为.rar的简单RAR归档文件,那不是问题,但是我的目录可以具有多个跨区归档文件,而我只希望该集中的第一个/主卷。我还希望目录中包含其他文件:

以下是示例目录的内容:


file.txt
somefile.zip
hello.rar
test.part1.rar
test.part2.rar
example.rar
example.r00


结果:


file.txt
somefile.zip
hello.rar
test.part1.rar
example.rar


这是我在目录上迭代的方式:

  import java.io.File;

  ...

  for (File child : (new File(myDirectoryPath)).listFiles()) {
    if (!child.isDirectory()) {
      //Do something with the file
    }
  }


我怎样才能做到这一点?我需要检测它是否是RAR存档。如果不是,请使用它。如果是的话,我需要检查它是否是存档的第一部分。如果是,则执行任何操作,否则将其忽略。

谢谢

最佳答案

寻找解决方案的困难在于,.rar归档文件跨越多个文件时,没有设置命名技术。此外,没有什么可以阻止用户创建一个随机文件,该文件的名称就像是rar文件的一部分。确定此错误的唯一正确方法是实际读取每个可疑文件的内容,并查看这是否是扩展的rar文件的延续。除了复杂之外,这还将是令人无法接受的缓慢。

但是,在大多数情况下,分割后的文件被命名为file.rarfile.rXX(精确地为2位数字)作为延续,或者以file.partXXX.rar命名为第一个文件为file.part1.rar(XXX从1开始并达到最大值数)。因此,您可以尝试使用FilenameFilter捕获这两种情况,如下所示。

这种方法的缺点是,如果碰巧是随机命名的文件,例如somefile.part2.rarotherfile.r03,它将丢弃文件,但是,希望这对您有很大帮助。

for (File child : (new File(myDirectoryPath)).listFiles(new FilenameFilter() {
    private Pattern p1 = null;
    private Pattern p2 = null;
    public boolean accept(File dir, String name) {

        name = name.toLowerCase();

        if(p1 == null) {
            p1 = Pattern.compile("\\.r\\d\\d");
            p2 = Pattern.compile("\\.part\\d+\\.rar");
        }

        if(name.endsWith(".part1.rar")) {
            return true;
        }
        else if(p2.matcher(name).matches()) {
            return false;
        }
        else {
            return !p1.matcher(name).matches();
        }
    }
}) {
    if (!child.isDirectory()) {
      //Do something with the file
    }
}

关于java - Java遍历目录中的所有文件和唯一的RAR归档文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11313632/

10-10 04:12