2015-06-17 15 views
6

Questo pezzo di codice ha funzionato perfettamente in VS 2010. Ora che ho VS 2013 non scrive più sul file. Non c'è errore o niente. (Ricevo un avviso in Notepad ++ affermando che il file è stato aggiornato, ma non c'è scritto nulla.)StreamWriter Non funziona in C#

Mi sembra tutto a posto. Qualche idea?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String line; 
      try 
      { 
       //Pass the file path and file name to the StreamReader constructor 
       StreamReader sr = new StreamReader("C:\\Temp1\\test1.txt"); 
       StreamWriter sw = new StreamWriter("C:\\Temp2\\test2.txt"); 

       //Read the first line of text 
       line = sr.ReadLine(); 

       //Continue to read until you reach end of file 
       while (line != null) 
       { 
        //write the line to console window 
        Console.WriteLine(line); 
        int myVal = 3; 
        for (int i = 0; i < myVal; i++) 
        { 
         Console.WriteLine(line); 
         sw.WriteLine(line); 
        } 
        //Write to the other file 
        sw.WriteLine(line); 
        //Read the next line 
        line = sr.ReadLine(); 
       } 

       //close the file 
       sr.Close(); 
       Console.ReadLine(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Exception: " + e.Message); 
      } 
      finally 
      { 
       Console.WriteLine("Executing finally block."); 
      } 
     } 
    } 
} 
+0

stai cercando nella directory giusta? hai aperto il file come controllo di integrità? – user1666620

+0

Prova anche a svuotare esplicitamente. – Lloyd

+4

Non vedo da nessuna parte che tu chiami sw.Close(); Se lo fai, la scrittura verrà svuotata e il file verrà chiuso. Inoltre, dovresti davvero considerare il wrapping di StreamReader e StreamWriter usando i blocchi: entrambi implementano IDisposable e si chiuderanno automaticamente quando lascerai il blocco using – thorkia

risposta

5

È necessario Flush() StreamWriter dopo la scrittura.

Per impostazione predefinita, StreamWriter è memorizzato nel buffer che significa che non verrà emesso finché non riceve una chiamata Flush() o Close().

Inoltre si può anche provare a chiudere in questo modo:

sw.Close(); //or tw.Flush(); 

si può anche avere uno sguardo a StreamWriter.AutoFlush Property

Ottiene o imposta un valore che indica se lo StreamWriter a filo suo buffer al flusso sottostante dopo ogni chiamata a StreamWriter.Write.

L'altra opzione che è ora un giorno molto popolare e consigliata è quella di utilizzare il using statement che si prende cura di esso.

Fornisce una comoda sintassi che garantisce il corretto utilizzo degli oggetti IDisposable .

Esempio:

using(var sr = new StreamReader("C:\\Temp1\\test1.txt")) 
using(var sw = new StreamWriter("C:\\Temp2\\test2.txt")) 
{ 
    ... 
} 
+4

O meglio, chiudilo –

+2

Dovresti usare l'istruzione "using" su StreamReader e StreamWriter. – tdbeckett

+0

@tdbeckett: - Sì, questo è lo standard e il modo consigliato! Grazie per averlo indicato! –

7

È necessario chiudere StreamWriter. In questo modo:

using(var sr = new StreamReader("...")) 
using(var sw = new StreamWriter("...")) 
{ 
    ... 
} 

Questo chiuderà i flussi anche se viene lanciata un'eccezione.

+2

+1 per le migliori "Best Practice". Tutti gli oggetti IDisposable dovrebbero (quasi sempre) essere abbinati a un'istruzione using. –

+0

Sì, è necessario utilizzare le istruzioni: non è necessario chiamare esplicitamente Flush/Close, quindi molto più ordinato. – Polyfun

+0

Anche questo ciclo può essere ripulito combinando la readline e il confronto while ((line = sr.ReadLine())! = Null) { // scrive la riga nella finestra della console Console.WriteLine (riga); int myVal = 3; per (int i = 0; i thorkia