读取和写入同一流中的文件

我试图以一种方式读取和写入同一文件,以便其他程序无法访问其间的文件:

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(); 

永远不会写入该文件。 如果我调试我可以看到读者设法获取文件的内容,但编写器似乎无法写入该文件。 什么都没发生。

我一直在看这个看起来和我一样的问题。 但是我无法让它发挥作用。

只需将您的更改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(); 

你可能会看到这篇文章在C#中同时读写一个文件 (打开多个流来读写)

如上所述 – 只需添加Flush()以强制将流中保存的数据写入文件。 在评论中,您提到过您之前使用过’使用’语句,但这没有用。

简要说明原因如下:

  1. using语句会自动调用Flush(),因此您不必这样做。

  2. 当您处理StreamReader(或StreamWriter)时 – 就像使用’using’语句一样 – 内部流对象也会被丢弃,并且您将丢失流的句柄。

@EJS是一个简单的静态方法,如果它不存在,你可以用它来创建一个新文件,如果它存在的话,可以写入同一个文件

简单的用法

 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(); } } }