繁体   English   中英

返回文件的递归方法值

[英]Return files values of recursive method

我想返回一个递归方法的值,该方法列出目录和子目录中的所有文件。 目标是创建一个md5文件值的HashSet。

目前,该代码可以正常运行,但仅在根目录下有效,而不是递归。

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()也不是一个好方法。

谢谢 !

您需要的基本设置类似于以下伪代码

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!

提取localMD5listing if语句进入一个方法recurseMD5 ,需要一个文件参数和散列的更新列表。 然后通过调用开始该过程

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM