C#如何在不改变原有文件内容下直接修改文件某一部分的内容?
高洛峰
高洛峰 2016-11-12 11:19:56
0
1
1002

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(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,从而解决了在使用文件指针时不能移动到文件尾之前的位置的问题,并且可以以替换字符的方式写入。


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template