在C#中同时读写文件

时间:2010-09-28 22:28:18

标签: c# filestream streamreader streamwriter

我有一个文件,其中包含我想要监控更改的数据,以及添加我自己的更改。想像“Tail -f foo.txt”。

基于this thread,看起来我应该创建一个文件流,并将其传递给作者和读者。但是,当读者到达原始文件的末尾时,它无法看到我自己写的更新。

我知道这似乎是一个奇怪的情况......它更像是一个实验,看看它是否可以完成。

以下是我尝试的示例案例:


foo.txt的:
一个
b
ç
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。

5 个答案:

答案 0 :(得分:22)

好的,稍后编辑两次......

这应该有效。我第一次尝试它时,我想我忘了在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();

答案 1 :(得分:9)

@mikerobi是正确的,当您写入流时,文件指针会被更改并移动到流的末尾。你不指望的是StreamReader有自己的缓冲区。它从文件读取1024个字节,您将从该缓冲区获得结果。在缓冲区用完之前,它必须再次从FileStream中读取。找不到任何东西,因为文件指针位于文件的末尾。

你确实需要将FileStreams分开,每个FileStream都有自己的文件指针,以便有希望让它发挥作用。

答案 2 :(得分:3)

我相信每次你写一个字符时,你都在推进流的位置,所以下一次读取会尝试在你刚写完的字符之后读取。发生这种情况是因为您的流阅读器和流编写器使用相同的FileStream。使用不同的文件流,或在每次写入后在流中寻找-1个字符。

答案 3 :(得分:2)

对于使用相同流进行读写的问题的任何解决方案,您都不太可能满意。如果您尝试使用StreamReader读取文件的尾部,则尤其如此。

您希望拥有两个不同的文件流。如果您愿意,写入流可以是StreamWriter。读取流应该是二进制流(即使用File.OpenReadFileStream.Create创建),从文件读取原始字节,并转换为文本。我对this question的回答显示了它是如何完成的基础。

答案 4 :(得分:1)

如果您添加对StreamReader.DiscardBufferedData()的调用,是否会改变行为?