C#?使用?Filestream?修改大文件指定位置數(shù)據(jù)
前言
C# 中讀寫文件常規(guī)流程
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");至于修改內容 網(wǎng)上大多數(shù)是先把文件所有內容讀進內存,再把內容修改后寫入文件,這樣對于小文件沒有問題,但是對于大文件就不可行了;
操作步驟
- 我們首先寫一個函數(shù)來讀取一行數(shù)據(jù)
/// <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()來讀取一行呢?
由于接下來需要修改當前行的內容,讀取完當前行并確定需要修改的時候,需要把流的位置移動至行首,根據(jù)上面函數(shù)得到讀取的長度,使用代碼
fs.Seek(-len, SeekOrigin.Current);
如果用len=StreamReader.readLine(),再移動指針,你會發(fā)現(xiàn)流的位置會在更后面而不是偏移了len,不知道readLine是不是會預讀取,導致你覺得他只讀取了一行,實際他把流的指針移到后幾行了并且緩存了數(shù)據(jù),再做偏移的時候 結果就不對了 這就是為什么要用上面的方法讀取了;
- 好了,接下來遍歷讀取文件內容
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);
//***繼續(xù)往下讀取 直到行尾 把指針移到下一行行首
readRow(fs);
//修改完成直接跳出循環(huán),保存文件
break;
}
}到此這篇關于C# 使用 Filestream 修改大文件指定位置數(shù)據(jù)的文章就介紹到這了,更多相關C# Filestream 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#實現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)
本文主要介紹了C#實現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法
這篇文章主要介紹了DevExpress實現(xiàn)GridControl列頭繪制Checkbox的方法,需要的朋友可以參考下2014-08-08

