2012-11-21 59 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

相关问题