我正在将文件列表从源目录复制到目标目录,我需要在复制前检查重复的文件名。
谢谢..
答案 0 :(得分:1)
只是想知道,这还不够吗?
<copy todir="../new/dir" overwrite="false" verbose="true">
<fileset dir="src_dir"/>
</copy>
正如手册所说(http://ant.apache.org/manual/Tasks/copy.html):
详细 - 记录正在复制的文件。
覆盖 - 即使目标文件较新,也会覆盖现有文件。
因为这是一个低成本的解决方案。否则,我认为你需要创建自己的ant任务。
<强>更新强>
好的,所以我检查了ant copy任务的来源,我相信你可以通过在你的子类中扩展它来完成所需的(新的ant任务)。我假设您正在运行多个文件而不是一个。
所以你需要:
org.apache.tools.ant.taskdefs.Copy
实际上文件(可能是空目录)是复制的。这是子类重写的好方法。
@Override
protected void doFileOperations() {
if (fileCopyMap.size() > 0) {
Enumeration e = fileCopyMap.keys();
while (e.hasMoreElements()) {
String fromFile = (String) e.nextElement();
String[] toFiles = (String[]) fileCopyMap.get(fromFile);
for (int i = 0; i < toFiles.length; i++) {
String toFile = toFiles[i];
if (fromFile.equals(toFile)) {
log("Skipping self-copy of " + fromFile, verbosity);
continue;
}
if (new File(toFile).exists) {
log ("Warning: dest file already exists");
}
}
}
...
super.doFileOperations();
}
答案 1 :(得分:0)
这是一个更完整的实现:
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Copy;
public class CopyNonDuplicateTast extends Copy {
public CopyNonDuplicateTast() {
setOverwrite(true);
}
@Override
public void setOverwrite(boolean overwrite) {
super.setOverwrite(true);
}
@Override
protected void doFileOperations() {
Set<String> allToFiles = new HashSet<String>();
for (final Map.Entry<String, String[]> e : fileCopyMap.entrySet()) {
final String fromFile = e.getKey();
final String[] toFiles = e.getValue();
for (int i = 0; i < toFiles.length; i++) {
final String toFile = toFiles[i];
if (fromFile.equals(toFile)) {
continue;
}
File destFile = new File(toFile);
if ((destFile.exists() && destFile.isFile()) || allToFiles.contains(toFile)) {
String msg = "Destination file \"" + toFile + "\" exists";
IOException ex = new IOException(msg);
if (failonerror) {
throw new BuildException(msg, ex, getLocation());
}
log(msg, Project.MSG_ERR);
}
allToFiles.add(toFile);
}
}
super.doFileOperations();
}
}
通过此实现,同一副本任务中的两个文件集可能会失败:
<copyNonDuplicate todir="${deployment.dir}/languageFiles">
<fileset dir="../MyComponent1/src">
<include name="**/*.properties" />
</fileset>
<fileset dir="../MyComponent2/src">
<include name="**/*.properties" />
</fileset>
</copyNonDuplicate>