2013-11-20 3 views
0

Я хотел бы вернуть значения рекурсивного метода, который перечисляет все файлы в каталоге и подкаталогах. Цель состоит в том, чтобы создать HashSet значений файла md5.Возвращаемые значения файлов рекурсивного метода

На данный момент код работает нормально, но только в корневом каталоге, а не в рекурсивном режиме.

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 метода для возврата значения listChildren() в localMd5Listing(). Я думаю, что не лучший способ иметь listFile() в первом методе.

Спасибо!

ответ

0

Извлечь оператор if в localMD5listing в метод 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 
    } 
} 
+0

Я не думал о создании метода с 2 начальными переменными, и списком файлов , спасибо, что работают отлично! ;) Любая идея сравнить этот последний 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; 
} 

Я знаю, что это не полный код вообще, но при этом вы должны быть в состоянии сделать рекурсивный цикл. Не забудьте проверить, есть ли там каталоги ARE, или вы можете получить нулевой указатель!

Смежные вопросы