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.
Qual è l'eccezione? Potrebbe esserci un blocco di file. –
File.Delete può lanciare almeno sette diversi tipi di eccezione. quale stai prendendo? –
@Roboto, non intendi: WTE? TCBAFL? –