我想返回一个递归方法的值,该方法列出目录和子目录中的所有文件。目标是创建一个md5文件值的HashSet。
目前代码工作正常但只是在root目录中,而不是递归。
static Set<String> localMd5Listing() throws Exception {
List<String> localMd5List = new ArrayList<String>();
if(!baseModDirectoryFile.exists()){
System.out.println("baseModDirectory doesn't exist, check your baseModDirectory variable.");
}
else{
if(baseModDirectoryFile.isDirectory()){
File[] paths = baseModDirectoryFile.listFiles();
if(paths != null){
for(File path:paths){
if(path.isFile()){
FileInputStream fis = new FileInputStream(path);
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis);
fis.close();
localMd5List.add(md5);
}
else if(path.isDirectory()){
listChildren(path);
//Check md5 for children files as path.isFile condition
}
}
}
}
}
Set<String> localSet = new HashSet<String>();
localSet.addAll(localMd5List);
localMd5List.clear();
localMd5List.addAll(localSet);
return localSet;
}
listChildren递归结果的方法:
public static void listChildren(File dir) throws IOException{
File[] files = dir.listFiles();
for(File file:files){
if(file.isDirectory()){
listChildren(file);
}
else{
//Return file variable to use them in localMd5Listing()
}
}
}
不幸的是,我不知道如何将这两种方法链接到localMd5Listing()中返回listChildren()的值。我认为这也不是在第一个方法中使用listFile()的好方法。
谢谢!
答案 0 :(得分:0)
您想要的基本设置类似于以下伪代码
public List<string> getAllHashes() {
List<String> hashes = new List<String>();
//calculate all the hashes
foreach(directory d in directories) {
hashes.add(directory.getAllHashes());
}
return hashes;
}
我知道这不是完整的代码,但是有了这个,你应该能够进行递归循环。不要忘记检查那里是否有ARE目录,否则你可能会得到一个nullpointer!
答案 1 :(得分:0)
将localMD5listing中的if语句解压缩到方法recurseMD5
中,该方法接受File参数和哈希列表以进行更新。然后通过调用
recurseMD5(baseModDirectoryFile, localmd5List);
并且在recurseMD5
中,当参数是目录时,您只需在所有listFiles()上进行递归。如果OTOH是常规文件,则添加md5。
void recurseMD5(File it, List<String> hashes) {
if (it.isDirectory) {
for (File f : it.listFiles()) recurseMD5(f, hahses);
}
else {
// process MD5 hash of file
}
}