我正在开发一个大型Ant脚本(> 1000行),这是我从别人那里继承的(不再可用)。 我遇到Ant没有删除目录的问题。它在脚本中的某一点起作用,在另一点上它不起作用:Ant不会给出错误消息,但它也会使目录离开它们。
我在它周围放了一些groovy,检查是否存在目录:
<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移动,作为解决方法。这就是我所看到的:移动在目的地创建空目录,不从源中删除任何文件或目录,也不报告错误。 这些源目录/文件(我之前尝试删除)似乎有问题。
另一个尝试:下载最新版本的Ant和Groovy。相同的结果。
答案 0 :(得分:4)
你正在使用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包括文件和目录。