2013-03-12 5 views
12

Esiste un modo per verificare se un file è in uso o non è stato aperto da altri processi senza semplicemente tentare di aprirlo e rilevare un'eccezione? Non esiste un metodo di servizio per testare una cosa del genere?Controllare se un file è in uso senza provare a catturare?

+6

Bene, perché vorresti saperlo? Per aprire il file dopo comunque? Quindi puoi saltare l'assegno e provare direttamente perché potresti comunque ottenere una gara. – Joey

+0

@ non è necessario ma principalmente è la ragione, ma una volta che è coinvolto uno strumento di terze parti sarebbe utile determinare se il file può essere oppresso o non chiamare il metodo aperto della terza parte, comunque mi aspetterei di farlo tale metodo e non essere implementare la dichiarazione di cattura come arte del piano. – CloudyMarble

+0

possibile duplicato di [Come verificare se un file è già aperto da un altro processo in C?] (Http://stackoverflow.com/questions/1951791/how-to-check-if-a-file-is-already- open-by-another-process-in-c) –

risposta

15

Anche se ci fosse, non ti farebbe molto bene dato che dovresti comunque prendere l'eccezione per gestire la condizione di gara in cui il file è diventato non disponibile tra il tuo assegno iniziale e il tuo effettivo tentativo di apertura/accedervi

Non riesco a pensare a nessun avvincente vantaggio per un controllo difensivo preliminare. Porta solo a una duplicazione del codice non necessaria.

Se non ci sono stati ad una funzione IsFileAccessible, sarebbe probabilmente essere implementato come un blocco try/catch gigante che ha tentato di aprire il file, catturato fallimenti, e restituito il risultato.

+0

@CodyGray Thnx per rispondere, ma non è lo stesso come controllare il controllo di accesso di un file che può essere modificato in mezzo finché non lo accedo? ma ho questa opzione per chiedere questi controlli di accesso senza dover incorrere in una dichiarazione di cattura, può ancora accadere ma poi non sarebbe parte del mio piano. – CloudyMarble

+1

Hai ragione. Tuttavia, anche se non è possibile evitare di controllare eccezioni alla fine, potrebbe comunque essere interessante avere una funzione che controlli ciò senza necessariamente aprire il file. Alcuni strumenti utili forniscono tali informazioni e non si basano sul codice try/catch. –

+0

@SimonMourier È banalmente facile farlo senza try/catch. Basta chiamare 'CreateFile'. –

2

Posso verificare se è possibile aprire un file senza tentare di aprirlo? ?

Il framework .net, proprio come l'API di Windows sottostante, non fornisce tale funzionalità. Se si desidera sapere se un file può essere aperto o meno, è necessario tentare di aprirlo e verificare la presenza di errori.

1

modo interessante per evitare il try catch (ma implica un tentativo di aprire) è il LockFile() o CreateFile() funzioni:

MANICO WINAPI CreateFile (...)

Se la funzione riesce, il valore restituito è un handle aperto per il file, il dispositivo, la named pipe o lo slot di posta specificati.

Se la funzione non riesce, il valore restituito è INVALID_HANDLE_VALUE. Per ottenere informazioni dettagliate sull'errore, chiamare GetLastError.


BOOL WINAPI LockFile (...)

Se la funzione riesce, il valore di ritorno è diverso da zero (TRUE).

Se la funzione non riesce, il valore di ritorno è zero (FALSE). Per ottenere le informazioni sull'errore esteso , chiamare GetLastError.

Questo blocca il file specificato per l'accesso esclusivo da parte del processo chiamante, e in caso di fallimento scrive informazioni di errore all'ultimo errore del thread, che può essere retreived utilizzando la funzione GetLastError.

Sarebbe comunque pensabile che tra unlockFile e OpenFile un altro processo possa bloccare il file, ma è possibile minimizzare questo periodo mantenendo il file bloccato al momento in cui deve essere aperto.

+1

Chiediti da dove proviene hFile? –

+0

Il tuo diritto! Ho finito con CreateFile, anche se non genera un'eccezione e abilita il valore di ritorno readbale è ancora un tentativo di aprire il file – CloudyMarble

+1

Questo è esattamente quello che io e altri abbiamo detto. Accade così che i meccanismi .net per l'apertura dei file segnalino il fallimento con eccezioni. I meccanismi Win32 segnalano l'errore attraverso il valore restituito. Fondamentalmente arriva allo stesso modo alla fine. –

Problemi correlati