如何使用Ant检查是否存在文件夹?
我们可以检查文件是否存在,但是我们也可以对文件夹执行相同的操作吗?
答案 0 :(得分:96)
您使用类型设置为“dir”的available任务。
例如:
<available file="${dir}" type="dir"/>
进行条件处理的标准方法是使用condition task。在下面的示例中,如果目录存在,运行doFoo将回显消息,而运行doBar将回显消息,除非目录存在。
doFoo和doBar都需要 dir.check 目标,它根据可用任务的结果将 dir.exists 属性设置为true或false。 doFoo目标仅在该属性设置为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>
Antelope提供了其他任务,包括可以使处理更简单的If任务(对我来说更直观),您可以从download page下载Antelope任务。
答案 1 :(得分:29)
以下是将available
元素纳入if
测试的小例子。
<!-- 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.
答案 2 :(得分:9)
这是我的解决方案,它不需要设置属性并使用带有'if'或'unless'的目标:
宏:
<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}" />
答案 3 :(得分:1)
我使用ANT 1.8版本的解决方案,如果/除非不支持$ {evalTrueOrFalse}语法,旧版本可能无效。
<?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>
http://ant.apache.org/manual/properties.html#if+unless
[If / unless]在Ant 1.7.1及更早版本中,这些属性只能是属性名称。从Ant 1.8.0开始,您可以使用属性扩展。与旧款式相比,这为您提供了额外的灵活性。
答案 4 :(得分: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>
答案 5 :(得分:0)
这里是涉及for
循环的另一个示例。如果目录不存在,则失败。
<for list="dir1/, dir2/, dir3/" param="local.dir" >
<sequential>
<fail message="Directory @{local.dir} does not exist">
<condition>
<not>
<available file="@{local.dir}" type="dir" />
</not>
</condition>
</fail>
</sequential>
</for>