2014-05-18 110 views
-1

這是我的功能在文件中寫入:控制檯寫

FileStream file = new FileStream ("c:/Redirect.txt", FileMode.OpenOrCreate, FileAccess.Write); 
public void writeFile(string line, FileStream file) 
{ 
    StreamWriter writer; 
    TextWriter oldOut = Console.Out; 
    try 
    { 
     writer = new StreamWriter(file); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Cannot open Redirect.txt for writing"); 
     Console.WriteLine(e.Message); 
     return; 
    } 
    Console.SetOut(writer); 
    Console.WriteLine(line); 
    Console.SetOut(oldOut); 
    writer.Close(); 
    file.Close(); 
    Console.WriteLine("Done"); 
} 

這我如何使用它:

writeFile("********* Clienta *********",file); 
writeFile("Centre *** " + id,file); 

但是當我運行我的代碼,我得到這個錯誤:

Cannot open Redirect.txt for writing 
The stream can not be written. 

我的代碼出了什麼問題?

+1

是否有任何特定的原因,你重定向控制檯只是爲了寫入文件? 'StreamWriter'具有編寫看起來像'Console'對象的字符串的方法。國際海事組織沒有必要在這裏重定向控制檯並使用'Console.WriteLine',除非你的程序的其他部分使用'Console.WriteLine',有時你需要指向一個文件。 –

回答

1

你的問題是你正在關閉文件流兩次。第一次調用完成後,您已關閉文件,因此當您第二次調用時,它會嘗試在已關閉的文件流上創建一個Streamwriter。

刪除file.Close並將您的參數類型更改爲StreamWriter。在函數之外創建您的Streamwriter,並在完成寫入文件時關閉該文件。

嘗試這樣:

public void WriteFile(string line, string fileName) 
    { 
     try 
     { 
      using (var sw = new StreamWriter(fileName, true)) 
      { 
       sw.WriteLine(line); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Cannot open Redirect.txt for writing"); 
      Console.WriteLine(e.Message); 
      return; 
     } 

     Console.WriteLine("Done"); 
    } 

現在,而不是在你的FILESTREAM傳遞給你的函數,通過在你的C:/Redirect.txt

WriteFile("********* Clienta *********","C:/Redirect.txt"); 
WriteFile("Centre *** " + id, "C:/Redirect.txt"); 

我想指出:這是很子最佳。打開和關閉一個文件來調用這個函數是非常低效的。這樣做的更好的方法是創建一個對象,將消息寫入文件,以跟蹤StreamWriter和FileStream,然後傳遞該對象,以便只打開一次文件並關閉文件一次。如果它是一個長時間運行的程序,你可以爲每個「工作單元」(一個請求,週期性中斷,不管)設置這些對象中的一個。但是,這不是你要求的。

+0

你可以給我代碼示例嗎? – Chlebta

+0

它的工作,但我只得到最後一行writed我認爲在每次調用他刪除文件的內容,並只寫新內容 – Chlebta

+0

好吧,在這種情況下,用''使用(var sw = File.AppendText (fileName))'(兩個'using'語句被替換爲一個)。 ['File.AppendText'](http://msdn.microsoft.com/en-us/library/system.io.file.appendtext(v = vs.110).aspx)靜態方法負責打開文件並確保它處於追加模式。這將在追加新內容的同時保留現有的文件內容。那是你想要完成的嗎? –