2011-07-24 13 views
12

Supponiamo di scrivere una stringa molto lunga su un file utilizzando File.WriteAllText e un altro thread o processo sta tentando di leggere lo stesso file. Getterebbe qualche eccezione? In altre parole, qual è il parametro FileShare utilizzato dal metodo File.WriteAllText? Non è scritto nella documentazione!File.WriteAllText e accessi simultanei

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –

+0

@Jalal MSDN non documenta la modalità di condivisione viene utilizzato da 'File .WriteAllText'. – CodesInChaos

+0

Scusa, stavo leggendo velocemente. Ho pensato che stava chiedendo di 'FileShare' .. –

risposta

9

Questo è il codice sorgente da .net Framework 4.0. viene usato chiaramente StreamWriter che utilizza FileShare.Read internamente.

[SecuritySafeCritical] 
public static void WriteAllText(string path, string contents) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    if (path.Length == 0) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath")); 
    } 
    InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM); 
} 


private static void InternalWriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 

Questo è il codice che crea il flusso sottostante per StreamWriter.

private static Stream CreateFile(string path, bool append) 
{ 
    return new FileStream(path, append ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Read, 0x1000, FileOptions.SequentialScan); 
} 
5

MSDN non documenta quale modalità di condivisione è utilizzata.

È possibile visualizzare il codice sorgente (pubblicato o tramite un disassemblatore) oppure esaminare l'opzione in fase di esecuzione (ad esempio utilizzando Process Monitor e quindi convertendo i flag dell'API WIn32 nel valore FileShare).

Ma come non è documentato una patch o una nuova versione potrebbe cambiarlo.

In alternativa, se è importante aprire il file da soli utilizzando uno dei FileStream sovraccarichi che prende un parametro FileShare, aprire un StreamWriter su questo e poi scrivere il testo.

Eventuali eccezioni?

Sì. Se il file è già aperto con una modalità di condivisione incompatibile, l'apertura fallirà.

+0

Sulla base di alcune ricerche in un disassemblatore,' File.WriteAllText' utilizza un 'FileStreamn' che passa' FileShare.Read'. – Richard

+0

+1 per "Ma come non è documentato una patch o una nuova versione potrebbe cambiarlo." – CodesInChaos

+0

Quale versione del framework hai smontato? – Mehran

4

Eventuali eccezioni?

Sì. Dovresti assicurarti che mentre un processo sta scrivendo su un file, altri non lo stanno leggendo usando uno lock. Anche se si imposta il parametro su Read, ad esempio, che consentirebbe le successive aperture del file per la lettura e non generare immediatamente un'eccezione, non è una buona idea dato che i lettori probabilmente otterrebbero risultati corrotti.

+0

Che tipo di blocco useresti per il blocco tra processi? Presumo che il solito blocco di 'lock {/ * code * /}' sarebbe insufficiente. –

Problemi correlati