我有两个目录需要比较具有相同的文件。我成功地完成了以下工作:
<fileset dir="d:\test" id="onlyinbar">
<not>
<present targetdir="A_DIR"/>
</not>
</fileset>
<echo>these files are only in bar : ${toString:onlyinbar}</echo>
<fileset dir="A_DIR" id="differentbarfoo">
<different targetdir="d:\test" ignoreFileTimes="true"/>
</fileset>
<echo>these files are different in bar compared to foo : ${toString:differentbarfoo}</echo>
但是,如果其中任何一个属实,我需要发出其他任务。很长时间<condition>
标记似乎只支持文件到文件的比较,我看不到如何在<fileset>
标记内分配属性。将不胜感激。
答案 0 :(得分:2)
我们需要避免任何第三方贡献此解决方案。我的主要问题是标签的组合。我们知道我们的“测试”即文件集标签必须处于这种状态,但不知道如何。资源数量虽然缩短了问题:
<target name="export-report-icons" description="A description">
<condition property="test2" else="false">
<or>
<resourcecount when="gt" count="0" property="flength">
<fileset dir="d:\test" id="onlyinbar">
<present targetdir="DIRs_A" present="srconly"/>
</fileset>
</resourcecount>
<resourcecount when="gt" count="0" property="flength">
<fileset dir="DIR_A" id="differentbarfoo">
<different targetdir="d:\test" ignoreFileTimes="true"/>
</fileset>
</resourcecount>
</or>
</condition>
</target>
<target name="copyThis" depends="export-report-icons" if="${test2}">
....
</target>
这样做,为两个文件集中的一个成功的情况设置OR,计数器包装文件集资源,以便它可以在条件下托管,条件具有属性true或false,具体取决于ORed计数。如果$ {test2}为真,则执行“copy-This”目标。请注意,如果设置id = test2,它将始终符合true,因为在这种情况下,它会检查值是否存在。
答案 1 :(得分:1)
<union>
set operator将多个集合中的资源分组到一个集合中。
同样,请查看<intersect>
和<difference>
。
你提到&#34;如果&#34;,我假设它引用了来自第三方Ant-Contrib库的<if>
任务。以下是<union>
组合的文件集与任何文件匹配时回显的示例:
<if>
<resourcecount when="gt" count="0">
<union id="Check">
<resources refid="onlyinbar"/>
<resources refid="differentbarfoo"/>
</union>
</resourcecount>
<then>
<echo>There are differences: ${toString:Check}</echo>
</then>
</if>