Ant任务,用于检查目标目录中的重复文件

时间:2013-01-30 06:37:20

标签: ant

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

谢谢..

2 个答案:

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

所以你需要:

  • 这不是必须的,但我相信它会对你有所帮助:下载Ant的源代码(你正在使用的版本),让我们假设你使用最新版本:{{3} }
  • 创建自己的ant任务。对于文档如何操作并使用它,请参阅:http://ant.apache.org/srcdownload.cgi (查看示例部分)
  • 确保您的课程扩展课程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();
}

答案 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>