如何使用FileSet在ant中选择子目录?

时间:2010-01-26 20:43:17

标签: ant fileset

我正在使用ant 1.6.2,我正在尝试设置一个比较源目录和目标目录的任务,识别源目录中存在的所有子目录,并删除目标目录中喜欢的命名子目录。 / p>

所以,说源目录中有子目录sub1,sub2和sub3,目标目录中有sub1,sub2,sub3和sub4,那么我想从目标中删除sub1,sub2和sub3 DIR。

我认为我可以通过使用FileSelector识别源中存在于目标中的所有目录来实现此目的。但是,我无法得到< type>文件选择器返回目录的匹配。

最终,我想我会做类似的事情:

<fileset id="dirSelector" dir="${install.dir}">
  <type type="dir"/>
  <present targetdir="${dist.dir}"/>
</fileset>

我首先尝试列出源目录中的目录并将其打印出来:

<fileset id="dirSelector" dir="${install.dir}">
  <type type="dir"/>
</fileset>
<property name="selected" refid="dirSelector" />
<echo>Selected: ${selected}</echo>

但是,我从来没有打印过将类型选择器设置为目录的任何内容。如果我将类型更改为文件,我会打印出文件。

有没有更好的方法来完成我想要做的事情?我在使用类型选择器时遗漏了什么?

1 个答案:

答案 0 :(得分:4)

如果不编写自定义Ant任务,这将会有点混乱。如果您乐意使用ant-contrib库,以下应该可以解决问题。这有点像黑客(特别是它使用属性的方式),但似乎工作正常。

<project name="stackoverflow" default="delete_target_dirs">

  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
      <pathelement location="ant-contrib-1.0b3.jar"/>
    </classpath>
  </taskdef>

  <property name="src.dir" value="src"/>
  <property name="target.dir" value="target"/>

  <target name="delete_target_dirs">

    <for param="file">
      <path>
        <dirset dir="${src.dir}">
          <include name="**"/>
        </dirset>
      </path>

      <sequential>
        <basename property="@{file}_basename" file="@{file}" />
        <available property="@{file}_available" file="${@{file}_basename}" filepath="${target.dir}" />
        <if>
          <equals arg1="${@{file}_available}" arg2="true"/>
          <then>
            <delete verbose="true">
              <dirset dir="${target.dir}" includes="${@{file}_basename}"/>
            </delete>
          </then>
        </if>                
      </sequential>
    </for>

  </target>

</project>