Ant检查是否存在一组文件

时间:2011-03-12 09:03:13

标签: ant

在ant中,我如何检查是否存在一组文件(以逗号分隔的路径列表)?

例如,我需要检查myprop中列出的所有路径是否存在,如果是,我想设置属性pathExist

<property name="myprop" value="path1,path2,path3"/>

因此,在示例中,path1 path2 path3必须存在才能将pathExist设置为true,否则false

我发现对于单个资源我可以使用resourceexist任务,但我无法弄清楚如何使用逗号分隔的路径列表。

如何检查一组路径的存在?谢谢!

3 个答案:

答案 0 :(得分:12)

您可以结合使用filelistrestrictcondition任务。

在下面的示例中,将使用逗号分隔的文件列表从属性创建文件列表。使用restrict找到不存在的文件列表。如果找到所有文件,则将其放在一个属性中。

<property name="myprop" value="path1,path2,path3"/>
<filelist id="my.files" dir="." files="${myprop}" />

<restrict id="missing.files">
  <filelist refid="my.files"/>
  <not>
    <exists/>
  </not>
</restrict>

<property name="missing.files" refid="missing.files" />
<condition property="pathExist" value="true" else="false">
    <length string="${missing.files}" length="0" />
</condition>
<echo message="Files all found: ${pathExist}" />

您可以使用类似的方法生成列出丢失文件的失败消息:

<fail message="Missing files: ${missing.files}">
    <condition>
        <length string="${missing.files}" when="greater" length="0" />
    </condition>
</fail>

答案 1 :(得分:2)

捆绑条件是检查多个目录或文件是否存在的最短解决方案:

<condition property="pathExist">
 <and>
  <available file="/foo/bar" type="dir"/>
  <available file="/foo/baz" type="dir"/>
  <available file="path/to/foobar.txt"/>
  ...
 </and>
</condition>

要检查路径的逗号分隔列表,请使用Ant addon Flaka,f.e。 :

<project xmlns:fl="antlib:it.haefelinger.flaka">

 <!-- when you have a cvs property use split function
      to get your list to iterate over -->
 <property name="checkpath" value="/foo/bar,/foo/baz,/foo/bazz"/>
  <fl:for var="file" in="split('${checkpath}', ',')">
    <fl:fail message="#{file} does not exist !!" test="!file.tofile.exists"/>
  </fl:for>               
</project>

另一种可能性是使用脚本条件任务和jvm脚本语言,如groovy,beanshell等。

答案 2 :(得分:1)

这可以通过Ant resource collections的设置操作来解决。如果计算所需文件列表与现有文件列表的交集,则它必须与所需文件列表不同。这说明了如何做到这一点:

<property name="files" value="a.jar,b.jar,c.jar"/>

<target name="missing">
  <condition property="missing">
    <resourcecount when="ne" count="0">
      <difference id="missing">
        <intersect>
          <filelist id="required" dir="." files="${files}"/>
          <fileset id="existing" dir="." includes="*.jar"/>
        </intersect>
        <filelist refid="required"/>
      </difference>
    </resourcecount>
  </condition>
</target>

<target name="check" depends="missing" if="missing">
  <echo message="missing: ${toString:missing}"/>
</target>

仅当文件丢失时,check目标才会报告丢失文件列表。