首页 > 解决方案 > c# 中的 FileStream - 检测流位置变化?

问题描述

当我正在学习 System.io FileStream 中的FileStream类时

我看到一段题为“检测流位置变化”(强调我的):

当 FileStream 对象的句柄没有独占保留时,另一个线程可以同时访问文件句柄并更改与文件句柄关联的操作系统文件指针的位置。在这种情况下,FileStream 对象中的缓存位置和缓冲区中的缓存数据可能会受到损害。FileStream 对象定期对访问缓存缓冲区的方法执行检查,以确保操作系统的句柄位置与 FileStream 对象使用的缓存位置相同。

如果在调用 Read 方法时检测到句柄位置发生意外更改,.NET Framework 将丢弃缓冲区的内容并再次从文件中读取流。这可能会影响性能,具体取决于文件的大小以及可能影响文件流位置的任何其他进程。

如果在对 Write 方法的调用中检测到句柄位置发生意外更改,则会丢弃缓冲区的内容并引发 IOException 异常。

我试图制作这段代码

 private void button1_Click(object sender, EventArgs e)
    {
       
        
        Task t1 =Task.Run(() => change());
        Task<string> t = Task.Run(() => mama());
        Thread.Sleep(1);

        textBox1.Text = t.Result;
    }
    void change()
    {
        FileStream fs = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, true);
        while(true)
        {
            fs.Seek(0, SeekOrigin.Begin);
            
        }
    }
    string mama()
    {
        FileStream fs2 = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 1, true);

        byte[] data = new byte[fs2.Length];
        fs2.Read(data,0, data.Length);
        return Encoding.Default.GetString(data);
    }

我希望文本框中不会附加任何文本,因为 fs2.read() 每次都会丢弃缓冲区

因为 fs.seek(0,seekorigin.begin) ,但是文本附加在文本框中,为什么?

谁能告诉我为什么文本会附加在文本框中,尽管我设置了 buffer = 1 并且文本不小

标签: c#filestream

解决方案


推荐阅读