在C#中同时读写一个文件
我有一个包含数据的文件,我想监视更改,以及添加我自己的更改。 想像“尾巴-f foo.txt”。
基于这个线程 ,它看起来像我应该创build一个文件stream,并将其传递给作家和读者。 但是,当读者到达原始文件的末尾时,它无法看到自己写的更新。
我知道这似乎是一个奇怪的情况…更多的是一个实验,看看是否可以做到。
这是我尝试的例子:
foo.txt的:
一个
b
C
d
Ë
F
string test = "foo.txt"; System.IO.FileStream fs = new System.IO.FileStream(test, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite); var sw = new System.IO.StreamWriter(fs); var sr = new System.IO.StreamReader(fs); var res = sr.ReadLine(); res = sr.ReadLine(); sw.WriteLine("g"); sw.Flush(); res = sr.ReadLine(); res = sr.ReadLine(); sw.WriteLine("h"); sw.Flush(); sw.WriteLine("i"); sw.Flush(); sw.WriteLine("j"); sw.Flush(); sw.WriteLine("k"); sw.Flush(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine();
读过“f”后,阅读器返回null。
好的,稍后再进行两次编辑…
这应该工作。 我第一次尝试它时,我想我忘记了在oStream上设置FileMode.Append。
string test = "foo.txt"; var oStream = new FileStream(test, FileMode.Append, FileAccess.Write, FileShare.Read); var iStream = new FileStream(test, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); var sw = new System.IO.StreamWriter(oStream); var sr = new System.IO.StreamReader(iStream); var res = sr.ReadLine(); res = sr.ReadLine(); sw.WriteLine("g"); sw.Flush(); res = sr.ReadLine(); res = sr.ReadLine(); sw.WriteLine("h"); sw.Flush(); sw.WriteLine("i"); sw.Flush(); sw.WriteLine("j"); sw.Flush(); sw.WriteLine("k"); sw.Flush(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine(); res = sr.ReadLine();
@mikerobi是正确的,当你写入stream时,文件指针被改变并移动到stream的末尾。 你不在指望的是,StreamReader有它自己的缓冲区。 它从文件中读取1024个字节,您将从该缓冲区中获得结果。 直到缓冲区用完,所以它必须再次从FileStream读取。 没有find,因为文件指针在文件的末尾。
你真的需要分开FileStreams,每个都有自己的文件指针有任何希望使这个工作。
我相信,每当你写一个angular色,你正在推进stream的位置,所以下一次读取试图读你刚刚写的angular色。 发生这种情况是因为您的stream读取器和stream写入器正在使用相同的FileStream。 使用不同的文件stream,或在每次写入后在stream中search-1个字符。
对于这个问题的任何解决scheme,包括使用相同的数据stream进行读写,都不太可能。 如果您试图使用StreamReader
读取文件的尾部,则尤其如此。
你想有两个不同的文件stream。 如果你喜欢,写入stream可以是StreamWriter
。 阅读stream应该是一个二进制stream(即用File.OpenRead
或FileStream.Create
创build),从文件读取原始字节,并转换为文本。 我对这个问题的回答显示了如何完成的基础知识。
如果你添加一个对StreamReader.DiscardBufferedData()
的调用,是否改变了行为?