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):

verbose-コピーされているファイルをログに記録します。

上書き-宛先ファイルが新しい場合でも、既存のファイルを上書きします。

これは労力の少ないソリューションになるためです。そうでなければ、あなたはあなた自身のアリのタスクを作成する必要があると思います。


アップデート:

OK、それで私はantコピータスクのソースをチェックしました、そしてあなたがあなたのサブクラス(新しいantタスク)でそれを拡張することによってあなたが必要なことをすることができると私は信じます。私が想定しているように、1つだけではなく、複数のファイルのコピーを実行しています。

したがって、次のことを行う必要があります。

  • これは必須ではありませんが、役立つと思います。Antのソースコード(使用しているバージョン)をダウンロードし、最新のものを使用していると仮定しましょう。http://ant.apache.org/srcdownload.cgi
  • 独自のantタスクを作成します。それを実行して使用する方法については、以下を参照してください。http://ant.apache.org/manual/develop.html(サンプルセクションを確認してください)
  • クラスがクラスを拡張していることを確認してください:org.apache.tools.ant.taskdefs.Copy
  • javadocによると、スーパークラスメソッドdoFileOperationsをオーバーライドします。

    実際にファイル(および場合によっては空のディレクトリ)がコピーされます。これは、サブクラスをオーバーライドするのに適した方法です。

ダウンロードしたソースのメソッドの内容を確認すると、実装は次のようになります。

@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();
    }

}

この実装では、同じコピータスク内の2つのファイルセットが失敗する可能性があります。

<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 に答える