【问题标题】:How to check if directory exists before deleting it, using ANT?如何在使用 ANT 删除目录之前检查目录是否存在?
【发布时间】:2011-06-13 19:01:42
【问题描述】:

使用ANT,我怎样才能在尝试删除它之前确保该目录存在?

作为我当前清洁任务的一部分,我

<target name="clean" description="clean">
    <delete dir="${build}" />
    <delete dir="${bin}" />
    <delete dir="${dist}/myrunner.${version}.jar" />
    <delete dir="${doc}" />
    <delete dir="${report}" />
</target>

这很好用,但是(显然)删除会在有要删除的内容时发生。

使用ANT,如何检查目录是否存在?

【问题讨论】:

  • 删除前是否需要检查目录是否存在?

标签: ant build


【解决方案1】:

对于这种特定情况,我不会回答“如何查找目录是否存在”的问题,因为已经回答了这个问题,但我只是要指出,在您的清理任务中,您可以使用failonerror="false" 防止 ant 任务退出。这应该适用于清洁任务,因为如果没有什么要清洁的,那应该不是问题。

    <target name="clean" description="clean">
        <delete dir="${build}" failonerror="false"/>
        ....
        <delete dir="${report}" failonerror="false"/>
    </target>

如果您不想安装 ant-contrib 或由于某种原因无法安装,这很有用。

【讨论】:

  • 如果有一些东西要清理,但由于其他一些错误而失败,例如有人锁定了目录中的文件以进行编辑,该怎么办?您希望报告这些错误。
  • 简单。干净的。很好的答案。
  • 我同意卡洛斯的观点。您将错过 failonerror="false" 的真正错误。为了避免失败而忽略各种错误,如果一切都已经是干净的接缝是个坏主意。
  • 当然,这是正确的做法。在“干净”目标中,并添加“failonerror”标志。
  • 我也同意@Carlos。在丢失目录的情况下,我在删除任务中设置 quiet="true" 以模拟 Unix 'rm -f' 命令,该命令将丢失目录作为非致命事件接受。这仍然允许强制执行其他 IO 错误。
【解决方案2】:

对于 vanilla ant,您可以使用 =

 <target name="check">
  <condition property="deldir">
    <available file="${somedir}" type="dir"/>
  </condition>
 </target>

 <target name="deldir" depends="check" if="deldir">
 <delete dir="${somedir}"/>
    <!-- .. -->
 </target>

另见 = Ant check existence for a set of files
类似的问题

【讨论】:

    【解决方案3】:

    下面是干净整洁的解决方案: 使用ant-contribs.jar

    使用此解决方案时,请务必将以下行放在顶部

    <!-- For <if> statements -->
    <taskdef resource="net/sf/antcontrib/antlib.xml" />
    

    <!-- Remove distribution directories and their content for a clean build --> <target name="clean" description="clean"> <if> <available file="${build}" type="dir" /> <then> <delete dir="${build}" /> </then> </if> </target>

    【讨论】:

      【解决方案4】:

      查看可用任务。

      这是一个类似的问题。

      Do I have a way to check the existence of a directory in Ant (not a file)?

      【讨论】:

        【解决方案5】:

        这是答案:

            <target name="delete.target.directory">  
                <delete includeemptydirs="true" verbose="false" if="${(directory::exists(directory))}">
                    <fileset basedir="${directory}">  
                        <include name="**/*.*" />  
                    </fileset> 
                </delete>
            </target> 
        

        【讨论】:

        • 这是什么版本的ANT?版本 1.9.6 因“删除不支持“if”属性而失败。
        【解决方案6】:

        您可以通过命令删除名称与您需要的名称相同的文件列表来做到这一点。这比创建一个特殊的目标要容易和直接得多。而且你不需要任何额外的工具,只需要纯 Ant。

            <delete>
                <fileset includes="name or names of file or files you need to delete"/>
            </delete>
        

        http://ant.apache.org/manual/Types/fileset.html

        【讨论】:

          【解决方案7】:

          您可以将这种蛮力技术用作纯 ant,这在没有附加条件的 maven 中特别有用。
          如果目录已经存在,mkdir 将不执行任何操作,如果由于某种原因无法删除该文件夹,则删除将失败。文件不存在的情况在构建脚本中很常见,其中一个构建步骤失败但执行了初始清理。

          <target name="clean">
              <mkdir dir="${project.basedir}/dist" />
              <delete dir="${project.basedir}/dist" />
          </target>
          

          【讨论】:

            猜你喜欢
            • 2012-10-23
            • 2017-06-08
            • 1970-01-01
            • 2012-09-12
            • 1970-01-01
            • 2018-04-18
            • 1970-01-01
            • 2011-02-15
            相关资源
            最近更新 更多