在ant中,我如何检查是否存在一组文件(以逗号分隔的路径列表)?
例如,我需要检查myprop
中列出的所有路径是否存在,如果是,我想设置属性pathExist
:
<property name="myprop" value="path1,path2,path3"/>
因此,在示例中,path1
path2
path3
必须存在才能将pathExist
设置为true
,否则false
。
我发现对于单个资源我可以使用resourceexist
任务,但我无法弄清楚如何使用逗号分隔的路径列表。
如何检查一组路径的存在?谢谢!
答案 0 :(得分:12)
您可以结合使用filelist
,restrict
和condition
任务。
在下面的示例中,将使用逗号分隔的文件列表从属性创建文件列表。使用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
目标才会报告丢失文件列表。