目录
- 前言
- 操作步骤
前言
C# 中读写文件常规流程
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); //读 StreamReader sr=new StreamReader(fs); string line=sr.readLine(); //写 StreamWriter s = new StreamWriter(fs); s.WriteLine("xxx");
至于修改内容 网上大多数是先把文件所有内容读进内存,再把内容修改后写入文件,这样对于小文件没有问题,但是对于大文件就不可行了;
操作步骤
- 我们首先写一个函数来读取一行数据
/// <summary> /// 在文件流当前位置开始读取改行的内容 返回改行的长度 /// </summary> private long readRow(FileStream fs20O) { long len = 0; byte[] b = new byte[1]; bool exit = false; while (true) { if (fs20O.Read(b, 0, 1) == -1) break; len++; string str = Encoding.UTF8.GetString(b); Console.Write(str); if ("\n".Equals(str)) { return len; } } return len; }
然后有人会问了,为啥我不用 StreamReader.readLine()来读取一行呢?
由于接下来需要修改当前行的内容,读取完当前行并确定需要修改的时候,需要把流的位置移动至行首,根据上面函数得到读取的长度,使用代码
fs.Seek(-len, SeekOrigin.Current);
如果用len=StreamReader.readLine(),再移动指针,你会发现流的位置会在更后面而不是偏移了len,不知道readLine是不是会预读取,导致你觉得他只读取了一行,实际他把流的指针移到后几行了并且缓存了数据,再做偏移的时候 结果就不对了 这就是为什么要用上面的方法读取了;
- 好了,接下来遍历读取文件内容
long len=0; while((len=readRow(fs)!=-1) { //...... //修改内容 //文件指针移动至行首 if(true) { fs.Seek(-len, SeekOrigin.Current); byte[] readWriteByte = Encoding.UTF8.GetBytes("Test"); //会直接把原来内容替换 fs.Write(readWriteByte, 0, readWriteByte.Length); //***继续往下读取 直到行尾 把指针移到下一行行首 readRow(fs); //修改完成直接跳出循环,保存文件 break; } }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)