C# – FileStream:既可以锁定文件又可以在不截断文件的情况下读取文件并将其截断

我想我的标题不是那么清楚。

我会试着解释一下:

我可以使用FileStream编写和读取文件

FileStream fs = new FileStream("C:\\Users\\Public\\text.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); private void button1_Click(object sender, EventArgs e) { fs.Seek(0,0); StreamReader sr = new StreamReader(fs); textbox.Text = sr.ReadToEnd(); } private void button2_Click(object sender, EventArgs e) { StreamWriter sw = new StreamWriter(fs); sw.Write(textbox.Text); sw.Flush(); } 

这种方式其他程序无法使用该文件,但我也无法删除内容。 写入它只会添加字符串,它不会替换内容。

或者我可以在没有FileStream的情况下完成:

 private void button1_Click(object sender, EventArgs e) { StreamReader sr = new StreamReader("C:\\Users\\Public\\text.txt"); textBox1.Text = sr.ReadToEnd(); sr.Close(); } private void button2_Click(object sender, EventArgs e) { StreamWriter sw = new StreamWriter("C:\\Users\\Public\\text.txt", false); sw.Write(textBox1.Text); sw.Close(); } 

这样,文件的内容被替换,但它没有锁定文件。

但我想要两个。 解决办法是什么?

在第一个示例中,您需要在写入流之前重置流以替换文件内容,而不是附加到它:

 private void button2_Click(object sender, EventArgs e) { fs.Seek(0,0); fs.SetLength(Encoding.UTF8.GetBytes(textbox.Text).Length)); StreamWriter sw = new StreamWriter(fs); sw.Write(textbox.Text); sw.Flush(); } 

如果将流截断为0,它也将起作用,无需以字节为单位计算新文件大小。

 fs.Seek(0,0); fs.SetLength(0);