Ant复制文件没有覆盖

时间:2010-08-17 13:36:09

标签: java ant build

在ant中是否有任何命令可以将文件从一个文件夹结构复制到另一个文件夹结构而不用检查上次修改日期/时间覆盖文件。基本上我想要从文件夹A到文件夹B的所有额外文件。即:没有文件夹B的文件被替换,但文件夹A的额外文件到达文件夹B

我看到了“蚂蚁复制”和“蚂蚁移动”命令,但没有帮助。任何建议。

6 个答案:

答案 0 :(得分:17)

Ant的复制任务的覆盖属性指出: “即使目标文件较新,也要覆盖现有文件。”

因此将其设置为false只会阻止它们在较新时被覆盖,但如果原始文件较新,则无论如何都会覆盖它们。

我发现解决这个问题的唯一方法是在复制之前触摸目标文件,即:

<touch>
  <fileset dir="${dest.dir}"/>
</touch>
<copy todir="${dest.dir}" overwrite="false">
  <fileset dir="${src.dir}"/>
</copy>

答案 1 :(得分:16)

你可以这样做:

复制单个文件

<copy file="myfile.txt" tofile="mycopy.txt"/>

将单个文件复制到目录

<copy file="myfile.txt" todir="../some/other/dir"/>

将目录复制到另一个目录

  

&lt; copy todir =“../ new / dir”&gt;&lt; fileset dir =“src_dir”/&gt;&lt; / copy&gt;

将一组文件复制到目录以及更多......

请参阅此链接以获取更多信息。Copy Task

答案 2 :(得分:6)

<touch>有效时,它会更新目标中的文件日期,因此对请求不完全正确。

根据文档如果您至少拥有Ant 1.6.2,则可以使用粒度属性。

  

在决定文件之前给出的毫秒数   过时了。这是必需的,因为不是每个文件系统都支持   将上次修改时间跟踪到毫秒级别。默认值为1   DOS系统上的秒或2秒。如果来源,这也很有用   和目标文件存在于时钟不在的单独机器上   同步。自Ant 1.6.2。

只需将其设置为大数。我用的是9223372036854,应该是292年左右(可能这已经足够了)。 (我只是将Long.max中的最后6位数字切掉),这足以不会产生有关未来日期的警告

<copy todir="${dest.dir}" overwrite="false" granularity="9223372036854">
  <fileset dir="${src.dir}"/>
</copy>

这将保证如果文件 at all ,他们将被ant任务看作不够老,因此,不会被覆盖(也不会被其他任务触及)

答案 3 :(得分:3)

如果没有优雅的解决方案,您可以按顺序执行:

  1. <move>文件夹<B><C>
  2. 文件夹<copy><A>
  3. <B>个文件 {li> <copy>使用<C>
  4. 文件夹<B>overwrite=true的文件

    (做反过来的事情,替换新文件,而不是旧文件)

答案 4 :(得分:2)

只需将<copy>标记与文件集**/*一起使用,并将overwrite属性显式设置为false。我一直都在用这个:

<copy todir="/your/target" overwrite="false">
  <fileset dir="/your/source" />
</copy>

答案 5 :(得分:2)

解决问题的简单方法是使用复制命令的overwrite参数。这将确保不替换文件

    <copy todir="B" verbose="true" overwrite="false">
        <fileset dir="A"/>
    </copy>

更复杂的示例是使用文件集selector

    <copy todir="B" verbose="true">
        <fileset dir="A">
            <present targetdir="B" present="srconly"/>
            <date datetime="01/01/2001 12:00 AM" when="after"/>
        </fileset>
    </copy>

在这个例子中,我使用当前选择器来选择目标目录中不存在的文件(功能上与覆盖检查相同)并且我添加了一个额外的 date 条件,用于测试自某个日期以来文件是否已被修改。

selector列表相当广泛。