我正在调查hadoop-core库中的FileUtil.copyMerge方法,虽然我不是Java专家但我有一种感觉,它不会删除仅的文件被复制和合并。我认为它只是删除了特定路径中的所有内容,这意味着如果在复制合并期间添加了文件,它们也会被删除,即使它们可能没有被复制合并。
以下是source code的相关部分:
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)
语句独立于else if (srcFS.isFile(src))
内部发生的事件,对我来说,这表明一旦完成最高位并且deleteSource
设置为true
,它只是从src
中删除所有文件,而不管它们是否在复制后合并时添加。
我的解释是否正确?
答案 0 :(得分:0)
我的解释是否正确?
我不这么认为。如果在复制合并阶段出现任何问题,则copyMerge
调用将以异常终止。这是在它进入删除阶段之前发生的。