返回递归方法的文件值

时间:2013-11-20 14:59:02

标签: java file recursion return hashset

我想返回一个递归方法的值,该方法列出目录和子目录中的所有文件。目标是创建一个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()的好方法。

谢谢!

2 个答案:

答案 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
     }
}