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
risposta
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);
}
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à.
Sulla base di alcune ricerche in un disassemblatore,' File.WriteAllText' utilizza un 'FileStreamn' che passa' FileShare.Read'. – Richard
+1 per "Ma come non è documentato una patch o una nuova versione potrebbe cambiarlo." – CodesInChaos
Quale versione del framework hai smontato? – Mehran
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.
Che tipo di blocco useresti per il blocco tra processi? Presumo che il solito blocco di 'lock {/ * code * /}' sarebbe insufficiente. –
- 1. File.WriteAllText e File.Copy issue
- 2. AVCaptureVideoDataOutput e AVCaptureMovieFileOutput simultanei
- 3. Ingresso e uscita simultanei in Perl
- 4. Controllo versione distribuito e controllo accessi
- 5. Accelera rsync con trasferimenti simultanei/simultanei di file?
- 6. Download simultanei - Python
- 7. Controllo accessi Cassandra
- 8. Gestione accessi IAM AWS
- 9. Thread Worker swing non simultanei
- 10. Esecuzione di script PHP simultanei
- 11. Librerie avanzate di controllo accessi
- 12. hg controllo accessi all'archivio centrale
- 13. Come rilevare due tocchi simultanei?
- 14. Registro accessi dallo script Elasticsearch
- 15. . Thread max simultanei timer timer
- 16. Numero massimo di HttpWebRequests simultanei
- 17. Servizio WCF per molti client simultanei e accesso al database
- 18. Modello di memoria Java: riordinamento e blocchi simultanei
- 19. Lettura e aggiornamento simultanei in una tabella di database
- 20. SQL Azure: elenca tutti gli accessi e gli utenti
- 21. Conta gli accessi e le disconnessioni sul computer Windows 7
- 22. Come posso prevenire build simultanei in CruiseControl.NET?
- 23. Best practice in Programmazione degli accessi
- 24. QTcpServer lento con molti client simultanei
- 25. Più sistemi di controllo versione simultanei?
- 26. download di sfondo simultanei su iphone
- 27. Caching & avoiding Cache Stampedes - più calcoli simultanei
- 28. promemoria Outlook simultanei su più dispositivi
- 29. Gestione di più caricamenti simultanei multipli
- 30. Come gestire gli aggiornamenti simultanei nei database?
[MSDN] (http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx) –
@Jalal MSDN non documenta la modalità di condivisione viene utilizzato da 'File .WriteAllText'. – CodesInChaos
Scusa, stavo leggendo velocemente. Ho pensato che stava chiedendo di 'FileShare' .. –