Ant删除首先起作用,然后不起作用

标签 ant delete-file

我正在编写一个大型 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。我尝试添加 sleep ,以防止锁定问题。创建目录的应用程序是 Java 应用程序 (Tibco appManage)。这些目录包含 XML 文件,没有 jar 文件。我检查了 ANT_HOME 和 CLASSPATH:没有问题。 我错过了什么?

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

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

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

最佳答案

您正在使用dirset。使用文件集。

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

第一次,它可以工作,因为目录是空的。第二次,他们就不是了。我可以这么说,因为 <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 实际上有用的情况。

一个fileset包括文件和目录。

关于Ant删除首先起作用,然后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090380/

相关文章:

java - 关闭使用 FileOutputStream 创建的文件,以便进行下一次删除

ios - 无法从 Dropbox 中删除文件(从 iPhone 应用程序)

amazon-s3 - 如何从 S3 中删除名称为空的文件

php - 在 codeigniter 中删除一个文件

ant - 如何在 Ant 中获得 flattenmapper 结果?

java - 为什么 Ant 可以识别某些环境变量而不识别其他环境变量

linux - 使用通配符复制

linux - 如何删除多个相同扩展名的文件但保留最新的

java - assertNotEquals 静态导入导致编译错误

java - 使用 Eclipse 时,Ant 会在哪里寻找您的 Java Home?