如何遍历目录中的所有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.rar
以file.rXX
(精确地为2位数字)作为延续,或者以file.partXXX.rar
命名为第一个文件为file.part1.rar
(XXX从1开始并达到最大值数)。因此,您可以尝试使用FilenameFilter
捕获这两种情况,如下所示。
这种方法的缺点是,如果碰巧是随机命名的文件,例如somefile.part2.rar
或otherfile.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/