我有办法检查Ant中的目录的存在(而不是文件)?

如何检查使用Ant的文件夹的存在?

我们可以检查一个文件的存在,但是我们可以对一个文件夹也做同样的事情吗?

您使用types设置为“dir”的可用任务。

例如:

<available file="${dir}" type="dir"/> 

条件处理的标准方法是使用条件任务 。 在下面的例子中,如果目录存在,运行doFoo会回显消息,而运行doBar会回显消息, 除非该目录存在。

dir.check目标是doFoo和doBar所必需的,它将dir.exists属性设置为true或false,具体取决于可用任务的结果。 doFoo目标只会在propery设置为true的情况下运行,而doBar只有在未设置或设置为false时才会运行。

 <?xml version="1.0"?> <project name="test" default="doFoo" basedir="."> <property name="directory" value="c:\test\directory"/> <target name="doFoo" depends="dir.check" if="dir.exists"> <echo>${directory} exists</echo> </target> <target name="doBar" depends="dir.check" unless="dir.exists"> <echo>${directory} missing"</echo> </target> <target name="dir.check"> <condition property="dir.exists"> <available file="${directory}" type="dir"/> </condition> </target> </project> 

羚羊提供额外的任务,包括一个如果任务,可以使处理更简单(对我来说,更直观),你可以从下载页面下载羚羊任务。

这里有一个小例子,将available元素合并到iftesting中。

 <!-- Test if a directory called "my_directory" is present --> <if> <available file="my_directory" type="dir" /> <then> <echo message="Directory exists" /> </then> <else> <echo message="Directory does not exist" /> </else> </if> 

警告 :您需要在ANT_HOME \ lib目录下使用ant-contrib.jar,否则您将无法访问if元素,并且您的脚本将失败并显示以下错误:

 Problem: failed to create task or type if Cause: The name is undefined. Action: Check the spelling. Action: Check that any custom tasks/types have been declared. Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

这是我的解决scheme,不需要设置属性,并使用“if”或“unless”来使用目标:

macros:

 <macrodef name="assertDirAvailable"> <attribute name="dir" /> <sequential> <fail message="The directory '@{dir}' was expected to be available but is not"> <condition> <not> <available file="@{dir}" type="dir" /> </not> </condition> </fail> </sequential> </macrodef> 

用法:

 <assertDirAvailable dir="${dirToCheck}" /> 

如果/除非不支持$ {evalTrueOrFalse}语法,我使用ANT 1.8版本的解决scheme可能无法正常工作。

 <?xml version="1.0" encoding="UTF-8"?> <project name="DoMagic" default="build" basedir="."> <property environment="env" /> <property name="name" value="Do the ANT Magic" /> <property name="somedir" value="./must_exist_folder"/> <tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> <target name="doMagic" if="${dir.exists}"> <echo message="Do the magic stuff" /> </target> <target name="doUsage" unless="${dir.exists}"> <echo message="Do usage and help" /> </target> <target name="build"> <echo message="Do the magic" /> <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition> <echo message="Folder found: ${dir.exists}" /> <antcall target="doCustomize"></antcall> <antcall target="doUsage"></antcall> </target> </project> 
  • ANT 1.6或早期ANT 1.7不起作用,升级到ANT 1.8版本。
  • 目标属性如果除非评估$ {var}语法为真/假
  • 条件属性其他值设置为属性,如果可用的条件是假的,没有它的variables没有设置。 NotSet值与显式的假值不同。
  • 调用任何目标,但如果/除非属性定义是否实际运行

http://ant.apache.org/manual/properties.html#if+unless
[如果/除非]在Ant 1.7.1及更早版本中,这些属性只能是属性名称。 从Ant 1.8.0开始,您可以使用属性扩展。 与旧式相比,这给了您更多的灵活性。

这里是另一种方法,只允许调用一个任务而不使用ant-contrib.jar。

 <target name="my-task" depends="dir-check"> <antcall target="my-task-install"/> <antcall target="my-task-update"/> </target> <target name="my-task-install" unless="dir.exists" > {some task} </target> <target name="my-task-update" if="dir.exists" > {another task} </target> <target name="dir-check"> <condition property="dir.exists"> <available file="my-dir" type="dir" /> </condition> </target>