读取和写入同一流中的文件
我试图以一种方式读取和写入同一文件,以便其他程序无法访问其间的文件:
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()以强制将流中保存的数据写入文件。 在评论中,您提到过您之前使用过’使用’语句,但这没有用。
简要说明原因如下:
-
using语句会自动调用Flush(),因此您不必这样做。
-
当您处理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(); } } }