在C#中同时读写文件

tbi*_*hel 14 c# filestream streamwriter streamreader

我有一个文件包含我想要监视更改的数据,以及添加我自己的更改.想像"Tail -f foo.txt".

基于这个线程,看起来我应该创建一个文件流,并将它传递给一个编写器和读者.但是,当读者到达原始文件的末尾时,它无法看到我自己写的更新.

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

这是我尝试的示例案例:


foo.txt:
a
b
c
d
e
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();
Run Code Online (Sandbox Code Playgroud)

过了"f"后,读者返回null.

Mar*_*lug 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();
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 9

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

你确实需要将FileStreams分开,每个FileStream都有自己的文件指针,以便让这个工作有任何希望.