Domanda

Ho una domanda in cui ho a volte bisogno di leggere dal file di essere scritti e di conseguenza di essere bloccato. Come ho capito dagli altri dovrei prendere l'IOException e riprovare fino a che non riesco a leggere.

Ma la mia domanda è: come faccio a sapere per certo che il file è bloccato e che non è un altro IOExcetpion che si verifica.

È stato utile?

Soluzione

Quando si apre un file per la lettura in NET sarà ad un certo punto cercare di creare un handle di file utilizzando il CreateFile funzione API che imposta il codice di errore che può essere usato per vedere perché non è riuscito:

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

Altri suggerimenti

C'è una discussione utile su gruppi Google che si dovrebbe leggere. Una delle opzioni è vicino a Darin di; Tuttavia, per garantire che si ottiene l'errore Win32 a destra, si dovrebbe chiamare l'OpenFile win32 () APIO te stesso (altrimenti, davvero non si sa quale errore si stanno recuperando).

Un altro è di analizzare il messaggio di errore: che fallirà se l'applicazione viene eseguita su un'altra versione linguistica

.

Una terza opzione è quella di incidere all'interno della classe di eccezione con la riflessione a ripescare l'HRESULT reale.

Nessuna delle alternative sono davvero così attraente: la gerarchia IOException trarrebbe beneficio da un altro paio di sottoclassi IMHO.

Per leggere i dati si può fare:

  

utilizzando (FileStream fs = new   FileStream (nome del file, FileMode.Open,   FileAccess.Read, FileShare.ReadWrite |   FileShare.Delete)) {....}

e di salvare in un file:

  

utilizzando (FileStream fs = new   FileStream (nome del file, FileMode.APPEND,   FileAccess.Write, FileShare.Read |   FileShare.Delete)) {...}

Bandiere al termine dei costruttori descrive quale altro processo può fare con il file. E 'bene, naturalmente, se controlli sia scrivere e leggere ...

È possibile aprirlo (come descritto da bezieur) quindi provare a bloccare sezioni (o il file intero): http://www.java2s.com/Code/VB/File- directory / Lockandunlockafile.htm

Vuoi dire che stai lettura e scrittura per il file? O che un'applicazione esterna sta scrivendo ad esso.

Se si sta facendo la lettura e la scrittura quindi presumo che stai facendo su diversi thread nel qual caso dà un'occhiata alla classe ReaderWriteLock che farà questo la gestione per voi, e consentono di fornire timeout.

http://msdn.microsoft.com/en -us / library / system.threading.readerwriterlock.aspx

In caso contrario, tutto quello che dovete fare è aprire il file in modalità di sola lettura. Allora non dovreste avere problemi:

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));

È possibile confrontare contro il tipo IOException per controllare e vedere se non è qualcosa d'altro

come

if (ex is FileNotFoundException)

Si potrebbe voler cercare l'aiuto su System.IO. Un sacco di eccezioni che ereditano in classe da IOException . Al di fuori di controllo per vedere se si tratta di un altro tipo di eccezione si può guardare nel messaggio della descrizione o si potrebbe guardare in si effettua una chiamata API Win32 in shell32.dll. Ci può essere una funzione in là per controllare se un file è bloccato.

Inoltre, se è assolutamente necessario attendere è possibile utilizzare loop, ma se si vuole fare altre azioni in attesa di utilizzare un thread asincrono.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top