2012-11-21 104 views
2

我試圖創建一個簡單的函數,將兩個或多個文件夾文件複製或合併到一個文件夾中。如何在Java中將兩個文件夾文件合併爲一個

我從下面開始。我想在這裏發佈以獲得更好的質量代碼。

public void copyDifferentFolderFilesIntoOne(String mergedFolderStr,String ... foldersStr) 
{ 
    File mergedFolder= new File(mergedFolderStr); 
    for(String folder: foldersStr) 
    { 
    //copy folder's files into mergedFolder 
    } 
} 

當在文件拷貝衝突(即具有相同名稱的文件存在於兩個或多個文件夾),我想與最新的時間戳的文件被複制在mergedFolder。

您是否知道將兩個或多個文件夾文件合併爲一個的最佳方式?

讓我知道如果問題不明確。

+2

檢查了這一點(的Java 7):http://docs.oracle.com/javase/7/docs/api /java/nio/file/Files.html#copy%28java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...%29 – nhahtdh

回答

2

您可以通過遍歷合併迪爾斯和保持最新的文件創建要複製的文件的Map<String, File>。然後你可以複製你在地圖上的文件。

一個示例代碼(沒試過)可能是這樣的:

public void copyDifferentFolderFilesIntoOne(String mergedFolderStr, 
     String... foldersStr) { 
    final File mergedFolder = new File(mergedFolderStr); 
    final Map<String, File> filesMap = new HashMap<String, File>(); 
    for (String folder : foldersStr) { 
     updateFilesMap(new File (folder), filesMap, null); 
    } 

    for (final Map.Entry<String, File> fileEntry : filesMap.entrySet()) { 
     final String relativeName = fileEntry.getKey(); 
     final File srcFile = fileEntry.getValue(); 
     FileUtils.copyFile (srcFile, new File (mergedFolder, relativeName)); 
    } 
} 

private void updateFilesMap(final File baseFolder, final Map<String, File> filesMap, 
     final String relativeName) { 
    for (final File file : baseFolder.listFiles()) { 
     final String fileRelativeName = getFileRelativeName (relativeName, file.getName()); 

     if (file.isDirectory()) {   
      updateFilesMap(file, filesMap, fileRelativeName); 
     } 
     else { 
      final File existingFile = filesMap.get (fileRelativeName); 
      if (existingFile == null || file.lastModified() > existingFile.lastModified()) { 
       filesMap.put (fileRelativeName, file); 
      } 
     } 
    } 
} 

private String getFileRelativeName(final String baseName, final String fileName) { 
    return baseName == null ? fileName : baseName + "/" + fileName; 
} 
+0

太棒了!我很高興在這裏問這個問題。 – Watt

相關問題