我正在将文件列表从源目录复制到目标目录,我需要在复制之前检查重复的文件名..
谢谢..
只是想知道,这是否足够?
<copy todir="../new/dir" overwrite="false" verbose="true">
<fileset dir="src_dir"/>
</copy>
正如手册所说(http://ant.apache.org/manual/Tasks/copy.html):
详细 - 记录正在复制的文件。
overwrite - 覆盖现有文件,即使目标文件较新。
因为这将是一个省力的解决方案。否则,我认为您需要创建自己的 ant 任务。
更新:
好的,所以我检查了 ant 复制任务的来源,我相信您可以通过在子类中扩展它来完成所需的操作(新的 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();
}
这是一个更完整的实现:
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>