3

我正在编写一个大型 Ant 脚本(> 1000 行),这是我从其他人那里继承的(不再可用)。我在 Ant 不删除目录时遇到问题。在脚本中的某个地方它可以工作,而在另一个地方却不行:Ant 不会给出错误消息,但它也会将目录留在它们所在的位置。

我在它周围放了一些时髦,以检查目录是否存在:

  <groovy>
    println("Directories in @{outFolder} are:")
    new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
  </groovy>
  <delete verbose="true" includeEmptyDirs="true" >
    <dirset dir="@{outFolder}" includes="**/*" />
  </delete>
  <echo>End of delete</echo>
  <groovy>
    println("Directories in @{outFolder} are:")
    new File("@{outFolder}").eachDir() { dir -> println dir.getName() }
  </groovy>

因此,这些行被调用并且它们工作。接下来,调用其他一些应用程序,它会创建新目录。再次调用完全相同的行(复制和粘贴,是的,它们是相等的),但现在目录没有被删除。另外:没有错误,Ant 继续运行。我在 Windows Server 2008 R2 上使用 Ant 1.8.1。我尝试添加睡眠,以防止锁定问题。创建目录的应用程序是 Java 应用程序 (Tibco appManage)。这些目录包含 XML 文件,没有 jar 文件。我检查了 ANT_HOME 和 CLASSPATH:那里没有问题。我想念什么?

对于聪明的驴友:当然,第二次删除不应该删除应用程序创建的所有内容,但为了确定问题,我使脚本行尽可能简单。

更多信息:由于我无法使删除工作,我尝试使用 Ant move 作为解决方法。这就是我所看到的:移动在目的地创建了空目录,不会从源中删除任何文件或目录,也不会报告错误。这些源目录/文件(我之前试图删除)似乎有问题。

另一种尝试:下载最新版本的 Ant 和 Groovy。结果相同。

4

1 回答 1

4

你正在使用一个dirset。使用文件集。

说明:dirset不是你想象的那样。您几乎总是想使用文件集。

第一次,它正在工作,因为目录是空的。第二次,他们不是。我可以告诉这一点,因为 a<dirset>包含目录对象本身,但其中没有任何文件,并且您在删除任务中使用“includeEmptyDirs”,这对 dirset 没有意义。

在这样的假设树中:

top/
  sub1/
    file.txt
  sub2/ (empty)

... dirset 集合会选择 top/、top/sub1/ 和 top/sub2/,但不会选择top/sub1/file.txt。<delete>对集合的行为,不会删除非空目录。因此,在上述情况下,它将删除 top/sub2(为空),但不会删除 top/sub1 或 top/。这也应该为您解释您<move>尝试的结果,这让您对 dirset 实际有用的情况有所了解。

文件包括文件和目录。

于 2012-04-11T06:47:43.977 回答