2011-09-22 17 views
10

Uno dei nostri progetti CruiseControl.NET continua ad intermittenza in mancanza, perché un compito msbuild fallisce conMSBuild “Impossibile rimuovere directory”

errore MSB3231: Impossibile rimuovere directory "d: \ Da qualche parte \ Dir \ Admin". Il parametro non è corretto.

Il corrispondente riga dello script msbuild è solo

<RemoveDir Directories="$(DistributionDir)\Admin" Condition="Exists('$(DistributionDir)\Admin')" /> 

Quando guardo lo stato dopo la generazione non riuscita, i contenuti della directory è stato rimosso con successo, ma la directory vuota in sé è rimasto lì. E la prossima build di solito riesce (dovendo rimuovere solo la directory vuota). Si noti che il problema non sembra essere il solito "qualche altro processo (come antivirus) continua a bloccare la directory", l'errore non è "accesso negato", ma uno strano "il parametro non è corretto".

Ho monitorato la generazione con SysInternals Process Monitor e il risultato è strano: tutto procede come previsto, il contenuto della directory viene enumerato, eliminato e quando l'enumerazione delle directory di livello superiore termina con "NO MORE FILES", la directory è chiusa e ... niente. Nessun altra operazione arriva al monitor di processo:

10:04:09,9190557 MSBuild.exe 3516 QueryDirectory D:\Somewhere\Dir\Admin NO MORE FILES 
10:04:09,9190928 MSBuild.exe 3516 CloseFile  D:\Somewhere\Dir\Admin SUCCESS 

Il prossimo (di successo) costruire tentativo è solo un noioso successo rimozione directory:

10:31:21,8616463 MSBuild.exe 1760 CreateFile D:\Somewhere\Dir\Admin SUCCESS Desired Access: Read Data/List Directory, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
10:31:21,8616861 MSBuild.exe 1760 QueryDirectory D:\Somewhere\Dir\Admin\* SUCCESS Filter: *, 1: . 
10:31:21,8617305 MSBuild.exe 1760 QueryDirectory D:\Somewhere\Dir\Admin SUCCESS 0: .. 
10:31:21,8617589 MSBuild.exe 1760 QueryDirectory D:\Somewhere\Dir\Admin NO MORE FILES 
10:31:21,8618209 MSBuild.exe 1760 CloseFile D:\Somewhere\Dir\Admin SUCCESS 
10:31:21,8621579 MSBuild.exe 1760 CreateFile D:\Somewhere\Dir\Admin SUCCESS Desired Access: Read Attributes, Delete, Synchronize, Disposition: Open, Options: Directory, Synchronous IO Non-Alert, Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
10:31:21,8622118 MSBuild.exe 1760 QueryAttributeTagFile D:\Somewhere\Dir\Admin SUCCESS Attributes: D, ReparseTag: 0x0 
10:31:21,8622408 MSBuild.exe 1760 SetDispositionInformationFile D:\Somewhere\Dir\Admin SUCCESS Delete: True 
10:31:21,8622676 MSBuild.exe 1760 CloseFile D:\Somewhere\Dir\Admin SUCCESS 

Sembra per qualche ragione, MSBuild/Windows rileva un qualche tipo di errore di parametro non valido prima che venga eseguita la rimozione della directory, ma non ho idea di dove cercare. (Ho anche provato a eseguire chkdsk, non è stato trovato nulla.Ho anche rimosso e ricreato la directory padre D: \ Somewhere \ Dir, nulla è cambiato.)

Quindi - qualsiasi idea di dove il problema potrebbe essere o come dovrei investigare ulteriormente?

(non sono sicuro dove questa domanda avrebbe dovuto andare, è una specie di qualche parte tra SO, Progs SE, server Fault, Superuser ...)

+0

Cosa succede se si rimuove la condizione? RemoveDir ha ContinueOnError impostato di default. –

+0

@Ritch Melton - ContinueOnError non sembra essere l'impostazione predefinita, aggiungendo l'aiuto di ContinueOnError, vedi sotto. – Mormegil

+0

Sono stato corretto. Ci scusiamo per le informazioni negative. –

risposta

9

non posso dire perché si sta venendo a mancare, ma se il la cartella è l'unica cosa rimasta può completare la compilazione correttamente? In tal caso, una soluzione alternativa sarebbe specificare ContinueOnError = "True".

+0

Ho avuto lo stesso problema qualche tempo fa e questa era la soluzione che dovevo accontentarmi. – skolima

+0

Questo sembra essere d'aiuto! Un'idea semplice che ha trascurato il problema, ma non mi è venuto in mente! Grazie! – Mormegil

2

Potrebbe essere un po 'tardi, ma ho trovato lo stesso errore e il problema sembra essere nella condizione di Exists. Sembra che la valutazione della condizione non rilasci in qualche modo la directory in conflitto con l'esecuzione dell'attività.
Rimuovendo la condizione della directory verranno rimossi se esiste ma la dichiarazione non mancherà se non esiste:

<RemoveDir Directories="$(DistributionDir)\Admin" />

+0

non ha funzionato per me .. – stijn

+0

Ho appena provato questo e funziona come un fascino. –

6

provato un sacco di cose, ma non sono riuscito a capire perché questo a volte fallisce quando la directory non è vuota; nel nostro caso la directory contiene collegamenti simbolici se questo è importante. Ad ogni modo non mi piace usare ContinueOnError dato che significa che c'è un errore reale che non lo conosci, o che devi fare un controllo extra come <Error Condition="Exists... dopo ogni RemoveDir.La soluzione che usiamo ora è quello di svuotare esplicitamente la directory, dopo il quale msbuild non sembra avere problemi rimozione è:

<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists($(PathtoEmpty))" 
    TaskAction="RemoveContent" Path="$(PathtoEmpty)" /> 
<RemoveDir Directories="$(PathtoEmpty)" /> 
5

Ho appena incontrato questo me stesso errore, si è scoperto che ho avuto l'incriminato cartella aperta in Windows Explorer e che ne impediva l'eliminazione corretta.

0

La risposta selezionata sembra essere un trucco, in quanto impedisce di ottenere l'errore effettivo che potrebbe essere un errore critico.

Potrei usare rimuovere contenuto invece di rimuovere la directory come di seguito.

<MSBuild.ExtensionPack.FileSystem.Folder Condition="Exists($(OutputPath))" TaskAction="RemoveContent" Path="$(OutputPath)" /> 
Problemi correlati