2011-09-09 8 views
22

Eventuali duplicati:
Wait until file is unlocked in .NETIl bene e il modo pulito per attendere che il file si chiude

Ho un file aperto, come un doc o txt, e devo aspettare fino a quando l'utente non lo chiude. Ho già provare questo, secondo Wait until file is unlocked in .NET:

while (true) 
{ 
    try 
    { 
     using (FileStream Fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None, 100)) 
     { 
      //the file is close 
      break; 
     } 
    } 
    catch (IOException) 
    { 
     //wait and retry 
     Thread.Sleep(1000); 
    } 
} 

Questo funziona bene, ma può essere possibile trovare una soluzione senza un try/catch e conduttore l'eccezione?

+3

Questa è una buona domanda. – TIHan

+0

Sfortunatamente, non è possibile, in generale. – SLaks

+4

C'è già una domanda per questo - hai persino pubblicato un link - quindi se questa è la risposta, questa è la risposta. È davvero un peccato non c'è un modo pulito, però. – Ryan

risposta

8

Purtroppo no, non c'è altro modo.

L'API non ha un evento che si attiva quando un file è sbloccato o qualsiasi altra cosa che sia conveniente.

Nuovo tentativo con le attese è la soluzione migliore con l'API corrente.

+0

Anche se potresti avere assolutamente ragione, mi chiedo ancora come Process Explorer di Mark Russinovich riesca a visualizzare le maniglie aperte del processo quasi in tempo reale. Lo fa anche tramite sondaggi frequenti? Cercherò di capirlo, e se trovo qualcosa di utile posterò la mia risposta qui. –

+0

@Igor: non sta usando il codice gestito. Non so cosa esponga l'API di Windows (e potrebbe utilizzare le funzionalità _undocumented_). – Oded

+2

Sure Mark utilizza l'API non gestita di livello basso (o carica dinamicamente il driver del kernel!), Ma l'OP non dice che il problema deve essere risolto utilizzando solo l'API gestita. È davvero interessante per me (e per molti altri, scommetto) come farlo senza l'approccio wait-and-loop. –

2

Per uno, però, non utilizzare il loop che hai adesso, break ing se non ci sono eccezioni - esegui il tuo accesso ai file in quel ciclo using.

successivo, se il file è aperto in un processo noto, si potrebbe ottenere il suo oggetto Process, impostare EnableRaisingEvents a true, e gestire l'evento Exited per riprovare. Tuttavia, non è sicuro, quindi gestirai comunque le eccezioni e userai un ciclo.

0

È possibile effettuare chiamate P/Invoke alla funzione CreateFile nativa e quindi analizzare il codice di errore. Tuttavia, try/catch sarà ancora necessario.

Problemi correlati