C#如何在不改变原有文件内容下直接修改文件某一部分的内容?

题主打算在不改变原有文件的情况下,将相对于文件开头offset偏移量后的内容替换为buffer缓冲区的内容,代码如下:

StreamWriter writer = new StreamWriter("file", true);
//设置指针位置
writer.BaseStream.Seek(offset, SeekOrigin.Begin);
//将buffer内的数据写进文件
writer.Write(buffer);
//关闭流
writer.Close();

当执行到第二句将指针指向要修改的位置时,引发了IOException异常,异常信息为无法通过向后搜索来覆盖以追加模式打开的文件中的原有数据,但如果以“覆盖”的方式打开下,文件原有内容会在StreamWriter对象被创建后抹去。请问在不使用把整个文件读取进缓冲区并在缓冲区修改数据后将整个缓冲区覆盖进文件的方法的情况下,如何对文件的某一部分进行直接的修改呢?

阅读 8.6k
1 个回答
✓ 已被采纳新手上路,请多包涵

只要将

StreamWriter writer = new StreamWriter("file", true);

改为

StreamWriter writer = new StreamWriter(File.OpenWrite("file"));

就可以了,原因如下:

StreamWriter writer = new StreamWriter("file", true);

中,StreamWriter会隐式构造一个FileStream对象,而该对象的打开方式由bool指定是否以Append方式打开,根据FileMode 枚举Append方式在试图查找文件尾之前的位置时会引发 IOException 异常,因此会产生题目的错误。
而使用File.OpenWrite打开文件则可以显式设置文件的打开方式为OpenOrCreate,访问方式为Write,从而解决了在使用文件指针时不能移动到文件尾之前的位置的问题,并且可以以替换字符的方式写入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进