2015-11-10 112 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'语句一样 - 内部流对象也被丢弃,并且丢失了流的句柄。