2010-01-05 12 views
10

Ho un'applicazione che sta cercando alcuni file con vecchi dati. Per essere sicuri di non danneggiare i buoni progetti, sto copiando i file in una posizione temporanea. Alcune delle directory che sto controllando sono directory di codice sorgente e hanno cartelle .svn. Usiamo Subversion per gestire il nostro codice.Non autorizzatoAccessException sui file appena creati

Dopo aver cercato tra tutti i file, voglio eliminare la cache temporanea. Sembra facile, giusto?

Per qualche motivo, tutte le mie directory .svn non verranno eliminate dalla cache. Arrestano l'app.

Per ragioni (troppo profonde per entrare qui), devo usare la cartella temporanea, quindi solo "scansionare il file originale" è fuori questione per motivi politici.

Posso andare in Explorer e cancellarli. Nessun problema. Nessun avviso. Cancella. Ma il codice si blocca con "Accesso a {file} negato". Sono alla fine del mio spirito con questo, quindi ogni aiuto sarebbe apprezzato.

Mentre ho semplificato la funzione un po 'per motivi di sanità mentale, il codice REALMENTE riguarda questo semplice.

List<string> tmpCacheManifest = new List<string>(); 
string oldRootPath = "C:\\some\\known\\directory\\"; 
string tempPath = "C:\\temp\\cache\\"; 

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 


// Okay.. I'm done.. Delete the cache. 
foreach (string file in tmpCacheManifest) 
{ 
    // CRASH! 
    File.Delete(file); 
} 

* Aggiornamento *: L'eccezione è UnauthorizedAccessException. Il testo è "Accesso al percorso" C: \ temp \ cache \ some-sub-dirs \ .svn \ entries "è negato."

E accade sotto XP, XP-Pro e Windows 7.

* Aggiornamento 2 * Nessuno dei miei convalida TENTATIVI anche di guardare i file sovversione. Ne ho bisogno, comunque. Fa parte della schifezza politica. Devo mostrare che OGNI file è stato copiato ... se è stato scansionato o meno.

E mi rendo conto di quali siano i soliti sospetti per File.Delete. Comprendo cosa significa UnauthorizedAccessException. Non ho accesso. Questo è un gioco da ragazzi. Ma ho appena copiato il file. Come posso NON avere accesso al file?

* Aggiornamento 3 * La risposta era nel flag "di sola lettura". Ecco il codice che ho usato per risolvere il problema:

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    //// NEW CODE //// 
    // Clear any "Read-Only" flags 
    FileInfo fi3 = new FileInfo(fn); 
    if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
    { 
     fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly)); 
    } 



    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 

+3

Qual è l'eccezione? Potrebbe esserci un blocco di file. –

+0

File.Delete può lanciare almeno sette diversi tipi di eccezione. quale stai prendendo? –

+0

@Roboto, non intendi: WTE? TCBAFL? –

risposta

12

Per quanto ricordo, Subversion contrassegna i file nelle sottodirectory .svn come di sola lettura.

Provare a reimpostare l'attributo di sola lettura prima di eliminare il file. Io non so davvero qualsiasi C#, ma un rapido Google suggerisce che questo potrebbe fare il trucco:

File.SetAttributes(file, FileAttributes.Normal); 
+1

Ho provato questo fuori, e di tutti i suggerimenti finora questo è l'unico che in realtà ha causato un'eccezione! – Justin

+0

Buona chiamata! Non avevo considerato "Solo lettura". Tuttavia, lancia comunque l'eccezione. Sto davvero per colpire qualcosa, qui. =) – Jerry

+0

OTTENUTO !! Finalmente ... il secondo incidente fu dovuto a un'altra stranezza, non a questo problema. – Jerry

-2

Non capire che cosa si vuole fare così tanto, ma per quanto riguarda chmoding a 777 o 775.: -/

Edit:

notato su Windows. Dovresti cambiare le autorizzazioni. Non so come fa Windows: -/

0

Prima di tutto: "Crash" indica un'eccezione, giusto? Quale? Puoi prenderlo e mostrarlo?

Seconda cosa: stai copiando i repository di subversion, anche se non ti interessa i metadati di subversion? Questo è ciò che riguarda svn export (nessuna directory .svn nella destinazione).

La risposta alla prima domanda è ciò che è veramente necessario fornire. Forse qualcosa cattura il .svn e blocca alcuni file. TortoiseSVN forse (per darti delle belle icone di sovrapposizione ..)?

2

L'unico problema che vedo sarebbe in questa parte:

// ... do some stuff to the cache to verify what I need.

Se si apre il file e dimenticare per chiuderla, avete ancora accesso esclusivo ad esso, e quindi non può cancellare più tardi.

+0

concordato. Se hai a che fare con oggetti 'FileStream', assicurati di chiamare' Close' su di essi (che chiama 'Dispose'). Ancora meglio sarebbe semplicemente avvolgerli in blocchi 'using'. –

+2

Questo non è la causa: se lo fai, impedisci ad altri processi di eliminare il file, tuttavia se lo stesso processo tenta di eliminare il file, non c'è alcun problema, dato che handle/lock appartiene allo stesso processo. Ho provato questo e non causa un'eccezione. – Justin

2

Sembra che non si dispone di accesso per eliminare il file ...

system.io.file.delete

Il link qui sopra dice che si ottiene quando UnauthorizedAccessException:

Il chiamante non ha la necessaria autorizzazione.

-o--

percorso è una directory.

oppure

percorso specificato un file di sola lettura.

È uno di quelli.

+0

Deve avere accesso per eliminare il file poiché ha avuto accesso a creare il file in primo luogo. – Justin

+0

Beh, si disse che è l'eccezione che viene lanciata, non so come. –

1

Sembra un problema di autorizzazioni. Tricky anche se ovviamente hai accesso in scrittura se File.Copy funziona già ....

L'unica cosa che posso pensare è che il file ha ancora un handle aperto da qualche parte (come altri hanno suggerito forse nel tuo fare qualche roba nella cache parte).

+0

Deve avere accesso per eliminare il file poiché ha avuto accesso a creare il file in primo luogo. – Justin

+0

@Kragen In realtà ho già affermato che nella mia risposta ... – James

0

Se una cartella contiene solo leggere i file, Directory.Delete non verrà eliminata e sollevare l'eccezione che sei ottenendo. Per i futuri visitatori di questa pagina, ho trovato una soluzione semplice che non ci richiede di ricorsione attraverso tutti i file e cambiare il loro attributo di sola lettura:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(cambiare un po 'per non sparare un finestra di cmd momentaneamente, che è disponibile su Internet)

Problemi correlati