2013-01-19 19 views
8

Ho un File.Delete nel mio clausola finally in questo modo:Devo chiamare File.Exists prima di chiamare File.Delete?

finally 
{ 
    //remove the temporary file 
    if(File.Exists(transformedFile)) 
     File.Delete(transformedFile); 
} 

Secondo il C# documentation, chiamando File.Delete su un file inesistente non buttare eccezioni.

È corretto rimuovere il File.Exists incapsulato o mi esporrà a possibili eccezioni aggiuntive?

+0

domanda simile che ho chiesto prima: http://stackoverflow.com/questions/8823395/guarding-against-exceptions-preventative-maintenance -quando-lavorando-con-rete –

+1

@my simile, ma non un duplicato – Codeman

risposta

9

Se necessario, non è sufficiente, in quanto il file potrebbe essere eliminato dopo aver confermato che esiste. In un caso come questo, la pratica migliore è semplicemente provare a eliminare il file. Se fallisce con un tipo di errore "file non trovato", allora saprai che il file non esiste. Ciò rimuove un'operazione extra ed evita qualsiasi tipo di finestra di gara.

+0

Buon punto sulle condizioni della gara. Questo non dovrebbe mai accadere nel mio codice, ma sappiamo tutti cosa succede con cose che "non dovrebbero mai accadere". – Codeman

+1

Giusto. La condizione della gara è la ragione generale per non farlo. Non è nemmeno necessario. –

9

C'è una situazione in cui il controllo di Exists prima di Delete impedisce un'eccezione. Se si dispone di un nome file con un percorso non valido, il metodo Exists restituisce false.

Quindi dipende dal comportamento che si desidera. In alcune sitazioni un percorso non valido dovrebbe causare un'eccezione.

Inoltre, solo perché il file esiste non significa che sia sempre possibile eliminarlo (in quel momento). Hai ancora bisogno della gestione delle eccezioni per problemi imprevisti.

+0

Non sono troppo preoccupato per i file che rimangono lì, e l'eccezione dovrebbe essere in bolla fino al nostro livello di registrazione (in più non voglio davvero provare/catturare finalmente il mio). Grazie! – Codeman

1

Diamo un'occhiata a questo logicamente e in modo critico. Supponendo che il doco MSDN non è accurato al 100% (esso contiene errori occasionali) e una FileNotFoundExceptionpotrebbe essere gettati, sarebbe causato da:

  1. il file non è mai esistito per cominciare (si è usciti dal try ed è entrato l'finally prima che il file è stato creato)

  2. si verifica un errore di programmazione (avete assemblato il percorso del file o il nome in modo errato)

Si presume che l'opzione # 2 non dovrebbe accadere, perché si verifica per questo, se può ancora accadere, allora si ha un codice maleodorante. Ciò lascia l'opzione n. 1 come l'unica opzione praticabile, nel qual caso non ti interessa l'eccezione, quindi ti basta prenderla e andare avanti. Ciò significa che la tua domanda specifica è ampiamente ridondante anche se è possibile lanciare un FileNotFoundException.

Tuttavia ...
sarei ancora avvolgere il File.Delete con un try/catch perché IMVHO ci sono ancora due eccezioni che sono possibili ed è necessario prendere atto di: IOException e UnauthorizedAccessException. Se si verifica uno di questi casi, dovresti considerare una sorta di attenuazione (magari impostare il file per la cancellazione al prossimo riavvio e/o avvisare l'utente in qualche modo).

+1

Anche se non sono d'accordo sul fatto che la documentazione MSDN non sia accurata al 100%, in questa situazione è corretta. File.Delete() non genera eccezioni se il file non esiste. –

+1

@ m-y Sì, si tratta di una situazione ipotetica, ma sto cercando di aiutare l'OP ad analizzare qualcosa di simile, il pensiero analitico è una parte fondamentale della programmazione. In ogni caso tutte le altre risposte (finora) si sono concentrate sul problema FileNotFound e hanno dimenticato la seconda parte della domanda ... – slugster

0

Ho chiesto a similar question a questa domanda prima, e sono arrivato a questa conclusione:

Dipende. Si, lo so...non è davvero una risposta semplice, ma qui ci sono alcune note da prendere per determinare se la tua situazione richiede un controllo di file esiste e/o un blocco try { ... } catch { ... } attorno al metodo File.Delete(...).

  • Il tuo codice ha generato il file? Se è così, non hai davvero bisogno di fare il controllo per vedere se il file esiste.
  • Ti interessa gestire altri problemi? Ricorda che stai lavorando con un file system e la documentazione MSDN mostra chiaramente che il metodo potrebbe generare eccezioni a causa di altre circostanze.
+0

Sì, probabilmente vorrei che altre Eccezioni semplicemente si presentassero, e non voglio catturarle. – Codeman

1

è ancora possibile ottenere altri tipi di eccezioni. ad esempio IOException se il file è in uso.

quindi se insistete eliminare file in finalmente blocco e volete essere sicuri di non ottenere eccezione appena messo un altro try-catch attorno File.Delete.

finally 
{ 
    try 
    { 
    //remove the temporary file 
    File.Delete(transformedFile); 
    } 
    catch 
    { 
    } 
} 

ma se il tuo obiettivo è quello di cancellare il file in ogni caso, penso che sarebbe una buona idea se si file aperto in esclusiva e in questo caso si dovrebbe vicino file e poi eliminare esso.

4

File.Delete non getta un FileNotFoundException, non importa. Genererà un'eccezione solo se il percorso non è valido, poiché contiene directory che non esistono, in tal caso verrà generato DirectoryNotFoundException.

Questo codice non genera alcuna eccezione.

var file = new FileInfo(@"C:\doesnotexist.file11111"); 
file.Delete(); 

Questo getterà DirectoryNotFoundException

var file = new FileInfo(@"C:\bad.dir\doesnotexist.file11111"); 
file.Delete(); 

MSDN File.Delete

Problemi correlati