2013-02-02 15 views
19

Mi sono imbattuto in qualcosa di interessante quando si utilizza uno StreamWriter con un FileStream per aggiungere testo a un file esistente in .NET 4.5 (non ho provato alcun framework precedente). Ho provato in due modi, uno ha funzionato e l'altro no. Mi chiedo quale sia la differenza tra i due.Scrittura su file txt con StreamWriter e FileStream

Entrambi i metodi contenevano il seguente codice nella parte superiore

if (!File.Exists(filepath)) 
    using (File.Create(filepath)); 

ho la creazione in una dichiarazione using perché ho trovato attraverso l'esperienza personale che è il modo migliore per garantire che l'applicazione si chiude completamente il file .

non METODO DI LAVORO:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    (new StreamWriter(f)).WriteLine("somestring"); 

Con questo metodo non finisce per essere aggiunto al file.

Metodo di lavoro:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    using (StreamWriter s = new StreamWriter(f)) 
     s.WriteLine("somestring"); 

Ho fatto un po 'di usare Google, senza sapere cosa cercare, e non hanno trovato nulla informativo. Quindi, perché l'anonimo StreamWriter fallisce dove il (non anonimo? Named?) StreamWriter funziona?

+2

Immagino che 'StreamWriter' in realtà non _write_ qualcosa fino a quando non viene svuotato e il suo metodo' Dispose' che viene chiamato implicitamente usando il blocco 'using' lo svuoterà automaticamente. EDIT: si noti che 'StreamWriter' ha una proprietà [AutoFlush] (http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx) che potrebbe controllare questo comportamento avendo esso svuota il flusso ogni volta che scrivi che suppongo sia 'falso' di default. –

+2

Questo è stato già risposto, ma perché vorresti formattare un codice del genere? È orrendo leggere e capire l'IMO, oltre che aumentare il rischio introducendo bug attraverso semplici errori di formattazione. Sono un grande fan delle parentesi graffe - sempre! – TheCodeKing

+0

@TheCodeKing se è stata già fornita risposta ti dispiacerebbe fornire un collegamento? L'ho cercato sinceramente e ho esaminato ogni risposta suggerita prima di postare e non ho visto nulla che rispondesse abbastanza (principalmente a causa del mio uso di una funzione anonima). Inoltre, non sono qui per discutere di cose che sono per lo più parte stilistica e basata sulla preferenza. Il codice IMO disseminato di parentesi graffe che non sono effettivamente necessarie è più difficile da leggere. –

risposta

19

Sembra che tu non lavare il flusso.

http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

Sembra StreamWriter scrive in un buffer prima di scrivere alla destinazione finale, in questo caso, il file. Potresti anche essere in grado di impostare la proprietà AutoFlush e non doverla svuotare esplicitamente.

http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx

Per rispondere alla tua domanda, quando si utilizza il blocco "tramite", si chiede smaltire sul StreamWriter, che deve in chiamata turno Flush.

+0

È difficile impostare la proprietà AutoFlush su un anonimo 'StreamWriter', non credi? A meno che non manchi qualcosa. –

+2

Non creare mai istanze anonime di tipi che implementano IDisposable. – xxbbcc

+2

Non suggerirei di utilizzare AutoFlush e non disporre l'oggetto. Se un oggetto è monouso, deve essere smaltito. – dtb

7

La differenza tra i due snippet di codice è l'uso di using. The using statement dispone l'oggetto alla fine del blocco.

A StreamWriter memorizza i dati prima di scriverli nel flusso sottostante. Smaltire il StreamWriter svuota il buffer. Se non scarichi il buffer, non viene scritto nulla.

Da MSDN:

È necessario chiamare Vicino a garantire che tutti i dati sono scritti in modo corretto verso il torrente sottostante.

Consulta anche: When should I use “using” blocks in C#?

+0

Non essere doloroso, perché lo stavo già assumendo più o meno, ma sarebbe possibile aggiungere alcuni riferimenti su dove trovare queste informazioni online? Questo è tanto per il beneficio degli altri quanto per il mio. –

Problemi correlati