2013-11-20 70 views
0

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

    } 

Unfortuntely我不知道如何将2种方法链接到localMd5Listing返回()listChildren的值()。我认为这不是在第一种方法中使用listFile()的好方法。

谢谢!

回答

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

我没想过用2个初始变量File和List 创建方法,谢谢你的工作正常! ;)任何想法比较这个最终的HashSet到另一个,并删除链接到哈希不包含在第二个HashSet中的文件?再次感谢你 ! – mickaelb91

+0

最后我到了用像你的例子那样的recurseDelete方法来删除文件。谢谢 ! – mickaelb91

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

我知道,这是完全没有任何的代码,但是这个你应该能够使递归循环。不要忘记检查那里是否有实际的目录,否则你可能会得到一个空指针!