I wonder if you have something else accessing the files at the same time... it could even be something entirely outside the build process, like a virus scanner, windows Search doing an index, etc? Sysinternals tools are good for seeing which process has a handle on a file/dir, although if it is a rare & intermittent problem you'll probably never catch it!
If its a reproducible timing issue, you might try including the NAnt <sleep> task... exponential backoff over your loop might make it a bit more reliable, even if it occasionally takes significantly longer? Is it possible there's some kind of temporary read-only file in there? the <delete> task will fail if it hits one of those. You can use <attrib> to make files writeable just before deleting. Don't know if any of those strategies will work, but its worth a try! Cheers, - Sam. On Fri, Jan 23, 2009 at 8:51 AM, Scott Vickery <[email protected]>wrote: > I should really get the ant source and figure out what the problem is. > Sounds like a timing hole? Maybe they are threading the delete? In lieu of > that, here is my modified solution: > > <project name="prj"> > <target name="cleanBuildDirs"> > <exec program="cmd" commandline="/c rmdir ..\dir1 /s /q" > if="${directory::exists('..\dir1')}"/> > <exec program="cmd" commandline="/c rmdir ..\dir1 /s /q" > if="${directory::exists('..\dir1')}"/> > <!-- etc --> > <delete file="..\file1"/> > <!-- etc --> > </target> > </project> > > This seems to work fine. > > Scott > > > On Fri, Jan 23, 2009 at 2:17 AM, Ruben Willems <[email protected]>wrote: > >> Hi >> >> >> I have the same problem, but no solution yet >> the problem is I can not reproduce it, it appearas now and than, but the >> real cause... >> >> I was thinking in placing it inside a loop or so, >> and try 3 times, when I got 3 errors , let the failure go through. >> >> lame solution, but I think it will work. >> >> >> with kind regards >> Ruben Willems >> >> >> >> Fri, Jan 23, 2009 at 5:30 AM, Scott Vickery <[email protected]>wrote: >> >>> Ok, I know this is not the NAnt mailing list, but, thought someone here >>> might have seen this problem. I have an nant task set up something like >>> this: >>> <nant> >>> <executable>C:\Program >>> Files\nant-0.85\bin\NAnt.exe</executable> >>> <baseDirectory>.\Build\</baseDirectory> >>> <buildFile>someBuild.build</buildFile> >>> <targetList> >>> <target>cleanBuildDirs</target> >>> </targetList> >>> </nant> >>> >>> The ant build looks something like this: >>> <project name="Online"> >>> <target name="cleanBuildDirs"> >>> <delete dir="..\dir1" if="${directory::exists('..\dir1')}"/> >>> <delete dir="..\dir2" if="${directory::exists('..\dir2')}"/> >>> <delete dir="..\dir3" if="${directory::exists('..\dir3')}"/> >>> <delete dir="..\dir4" if="${directory::exists('..\dir4')}"/> >>> <delete dir="..\dir5" if="${directory::exists('..\dir5')}"/> >>> <delete dir="..\dir6" if="${directory::exists('..\dir6')}"/> >>> <delete dir="..\dir7" if="${directory::exists('..\dir7')}"/> >>> <delete dir="..\dir8" if="${directory::exists('..\dir8')}"/> >>> <delete dir="..\dir9" if="${directory::exists('..\dir9')}"/> >>> <delete file="..\Project.sln"/> >>> </target> >>> </project> >>> >>> Every now and then I get an error from ant complaining that "The >>> directory is not empty". Here is part of the Nant stack trace: >>> >>> ber><columnnumber>10</columnnumber></location><stacktrace><![CDATA[ at >>> NAnt.Co >>> re.Tasks.DeleteTask.RecursiveDeleteDirectory(String path) >>> at NAnt.Core.Tasks.DeleteTask.ExecuteTask() >>> at NAnt.Core.Task.Execute() >>> at NAnt.Core.Target.Execute() >>> at NAnt.Core.Project.Execute(String targetName, Boolean >>> forceDependencies) >>> at NAnt.Core.Project.Execute() >>> at >>> NAnt.Core.Project.Run()]]></stacktrace><internalerror><type>System.IO.IOException</type><message><![CDATA[The >>> directory is not empty. >>> >>> This causes my build to fail. But, more importantly, even if I ignored >>> the error, the source is not getting deleted. Has anyone seen this and/or >>> have any suggestions regarding fixing it? >>> >>> Thanks, >>> Scott Vickery >>> >>> >>> >>> On Wed, Jan 21, 2009 at 9:27 PM, Scott Vickery >>> <[email protected]>wrote: >>> >>>> Great. That is what I was looking for. >>>> >>>> Thanks, >>>> Scott >>>> >>>> >>>> On Wed, Jan 21, 2009 at 9:22 PM, Sam Calder <[email protected]>wrote: >>>> >>>>> Better yet, use the NAnt 'if' attribute of the <delete> task with the >>>>> 'directory::exists' function to check if the directory exists first... >>>>> that >>>>> way it won't error out at all. >>>>> >>>>> Syntax is something like: >>>>> >>>>> <delete dir="test" if="${directory::exists('test')}" /> >>>>> >>>>> Cheers, >>>>> >>>>> - Sam. >>>>> >>>>> >>>>> >>>>> On Wed, Jan 21, 2009 at 7:53 PM, Craig Sutherland < >>>>> [email protected]> wrote: >>>>> >>>>>> >>>>>> Do the same thing but put the delete in an NAnt or MSBuild script - >>>>>> this way you could get it to ignore any errors. >>>>>> >>>>>> The mailing list is moderated, hence will be a delay until someone >>>>>> moderates the message. >>>>>> >>>>>> >>>>>> Craig >>>>>> >>>>>> On Jan 22, 6:11 am, Scott <[email protected]> wrote: >>>>>> > I have searched around for a solution to this, but, not found an >>>>>> > answer yet. >>>>>> > >>>>>> > I want to do a clean build every time I build. According to this, >>>>>> http://jira.public.thoughtworks.org/browse/CCNET-1256, >>>>>> > <cleanCopy>True</cleanCopy> for <sourcecontrol type="svn"> is not in >>>>>> a >>>>>> > CC build yet. As a work around, I decided to do this: >>>>>> > >>>>>> > <prebuild> >>>>>> > <exec> >>>>>> > <executable>cmd</executable> >>>>>> > <buildArgs>/c rmdir /s /q c:\buildFolder\code\trunk >>>>>> > \projectFolder</buildArgs> >>>>>> > </exec> >>>>>> > </prebuild> >>>>>> > >>>>>> > This work fine if the folder exists. But, the first time the >>>>>> project >>>>>> > is built, before the code is checked out, the build fails with "The >>>>>> > system cannot find the file specified." How can I get CC to ignore >>>>>> > that error? >>>>>> > >>>>>> > Thanks, >>>>>> > Scott Vickery >>>>>> >>>>> >>>>> >>>> >>> >> >
