3

我正在将文件列表从源目录复制到目标目录,我需要在复制之前检查重复的文件名..

谢谢..

4

2 回答 2

2

只是想知道,这是否足够?

<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 任务)。正如我假设您正在运行多个文件复制而不仅仅是一个。

所以你需要:

  • 好吧,这不是必须的,但我相信它会对您有所帮助:下载 Ant 的源代码(您正在使用的版本),假设您使用的是最新的:http://ant.apache.org/srcdownload.cgi
  • 创建你自己的蚂蚁任务。有关如何执行和使用它的文档,请参阅:http://ant.apache.org/manual/develop.html(查看示例部分)
  • 确保您的班级扩展班级org.apache.tools.ant.taskdefs.Copy
  • 覆盖超类方法 doFileOperations,因为它的 javadoc 说:

    实际上会复制文件(可能还有空目录)。这是子类覆盖的好方法。

检查您下载的源代码中的方法内容,您的实现可能类似于以下内容:

@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();
}
于 2013-01-30T06:56:42.753 回答
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>
于 2015-11-09T13:20:14.147 回答