2015-11-10 89 views
0

我試圖讀取和寫入的方式相同的文件,使得沒有其他的程序可以訪問該文件之間:讀取和寫入同一個流中的文件

FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);    
    StreamReader sr = new StreamReader(fs); 
    StreamWriter sw = new StreamWriter(fs); 
    newString = sr.ReadToEnd() + "somethingNew"; 
    sw.Write(newString); 
    fs.Close(); 

的文件從未寫入。如果我調試,我可以看到讀者設法獲取文件的內容,但作者似乎無法寫入文件。什麼都沒發生。

我一直在尋找this question這似乎是我的一樣。然而,我無法讓它工作。

+0

你得到了什麼錯誤? – Matt

+3

在'Write'之後嘗試'sw.Flush();''。 – Habib

+0

將'StreamReader'和'StreamWriter'附加到同一個流(它只有一個* single *'Position'值)可能會導致各種惡作劇。我會打開兩個流到同一個文件,一個讀取和一個寫入。 – spender

回答

2

就存在

簡單的用法@EJS,你可以用它來創建一個新的文件,如果不存在的話,以及寫在同一個文件一個簡單的靜態方法Flush您對文件的更改,在關閉流之前已有sw.Flush();。像:

string filePath = "test.txt"; 
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 
StreamReader sr = new StreamReader(fs); 
StreamWriter sw = new StreamWriter(fs); 
newString = sr.ReadToEnd() + "somethingNew"; 
sw.Write(newString); 
sw.Flush(); //HERE 
fs.Close(); 

您可能會看到這個帖子simultaneous read-write a file in C#(打開多個數據流的讀取和寫入)

+0

另外,在'using'語句中包裝流將會爲你調用'Flush()'。你也會知道他們正在關閉並一目瞭然。 – Yoink

+0

添加沖洗工作。我以前已經用它來包裝它,但是這並不起作用。 – EJS

0

如果它

string path = @"C:\SomePath\Name.txt"; 

if (!System.IO.File.Exists(path)) 
{ 
    WriteAndOrAppendText(path, "File Created"); 
} 
else if (System.IO.File.Exists(path)) 
{ 
    WriteAndOrAppendText(path, "New Boot.");    
} 

private static void WriteAndOrAppendText(string path, string strText) 
{ 
    if (!File.Exists(path)) 
    { 
     using (StreamWriter fileStream = new StreamWriter(path, true)) 
     { 
      fileStream.WriteLine(strText); 
      fileStream.Flush(); 
      fileStream.Close(); 
     } 
    } 
    else 
    { 
     using (StreamWriter fileStream2 = new StreamWriter(path, true)) 
     { 
      fileStream2.WriteLine(strText); 
      fileStream2.Flush(); 
      fileStream2.Close(); 
     } 
    } 
} 
+1

什麼是WriteAndOrAppendText方法中'if'和'else'的代碼的區別? – Michael

+0

可能更好地將'StreamReader'和'StreamWriter'放在'using'語句中,而不是顯式調用'Close',這樣當事情出錯時就會清理乾淨。 – spender

+0

@spender我完全同意,但這是快速和骯髒的,以幫助OP瞭解邏輯流程。這樣做也可以避免在用戶錯誤中獲得臭名昭着的文件' – MethodMan

1

如上所述 - 只需添加的flush()迫使流中保存的數據被寫入到文件。在你的評論中你提到過你曾經使用過「使用」聲明,但是這並沒有奏效。這裏

簡單的原因:

  1. using語句自動調用同花順(),所以你不必 來。

  2. 當您拋棄StreamReader(或StreamWriter)時 - 就像使用'using'語句一樣 - 內部流對象也被丟棄,並且丟失了流的句柄。