2016-03-30 10 views
1

私はhadoop-coreライブラリのFileUtil.copyMergeメソッドを探していますが、私はJavaの専門家ではありませんが、のみコピーしてマージしたファイルは削除されないと感じています。私はそれが単に特定のパスからすべてを削除すると思います。つまり、コピー・マージ中にファイルが追加された場合、コピー・マージされていなくても削除されます。FileUtil.copyMergeはマージされたファイルだけでなく削除しますか?

public static boolean copyMerge(FileSystem srcFS, Path srcDir, 
           FileSystem dstFS, Path dstFile, 
           boolean deleteSource, 
           Configuration conf, String addString) throws IOException { 
    dstFile = checkDest(srcDir.getName(), dstFS, dstFile, false); 

    if (!srcFS.getFileStatus(srcDir).isDirectory()) 
    return false; 

    OutputStream out = dstFS.create(dstFile); 

    try { 
    FileStatus contents[] = srcFS.listStatus(srcDir); 
    Arrays.sort(contents); 
    for (int i = 0; i < contents.length; i++) { 
     if (contents[i].isFile()) { 
     InputStream in = srcFS.open(contents[i].getPath()); 
     try { 
      IOUtils.copyBytes(in, out, conf, false); 
      if (addString!=null) 
      out.write(addString.getBytes("UTF-8")); 

     } finally { 
      in.close(); 
     } 
     } 
    } 
    } finally { 
    out.close(); 
    } 


    if (deleteSource) { 
    return srcFS.delete(srcDir, true); 
    } else { 
    return true; 
    } 
} 

最終if (deleteSource)文は、トップビットが行われた後deleteSourcetrueに設定されていることを示している私にはelse if (srcFS.isFile(src))、内部で何が起こるかとは独立している:ここでは

source codeから関連するセクションですコピー後のマージが追加されているかどうかにかかわらず、すべてのファイルを srcから削除するだけです。

私の解釈は正しいですか?

+0

...このメソッドは、コピーではなく、コピーではありません.Merge –

+0

おっと!私はコピー貼り付け中に非常に怠惰でした。実装はすべて同じように見える...申し訳ありませんが、私は今修正しました。 – Ian

答えて

0

私の解釈は正しいですか?

私はそうは思わない。コピー・マージの段階で問題が発生した場合、copyMergeコールは終了し、例外が発生します。それは削除の段階になる前に起こります。

+0

それは例外ではありません。コピー・マージが完了したばかりの新しいファイルが到着した場合、スローされる例外はありません。むしろ、最終的な 'if'に行き、srcDirにあるすべてのものを削除することができます。これには、コピー・マージされていない新しいファイルが含まれます。 – Ian

関連する問題