2

2つ以上のフォルダファイルを1つのフォルダにコピーまたはマージする簡単な関数を作成しようとしています。

以下から始めました。より良い品質のコードを得るために、ここに投稿しようと思いました。

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

ファイルのコピーで競合が発生した場合(つまり、同じ名前のファイルが2つ以上のフォルダーに存在する場合)、最新のタイムスタンプを持つファイルをmergedFolderにコピーしたいと思います。

2つ以上のフォルダファイルを1つにマージする最良の方法を知っていますか?

質問が明確でない場合はお知らせください。

4

2 に答える 2

2

Map<String, File>マージされたdirをトラバースし、最新のファイルを保持することで、コピーするファイルを作成できます。次に、マップにあるファイルをコピーできます。

サンプルコード(まだ試していません)は次のようになります。

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;
}
于 2012-11-21T22:27:24.570 に答える
1

ファイルをコピーするには、Javaでファイルをコピーする標準の簡潔な方法を見てください。

タイムスタンプを取得するには、File.lastModified()を参照してください。

于 2012-11-21T22:17:01.380 に答える