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");
至于修改內(nèi)容 網(wǎng)上大多數(shù)是先把文件所有內(nèi)容讀進(jìn)內(nèi)存,再把內(nèi)容修改后寫入文件,這樣對(duì)于小文件沒有問題,但是對(duì)于大文件就不可行了;
操作步驟
- 我們首先寫一個(gè)函數(shù)來讀取一行數(shù)據(jù)
/// <summary> /// 在文件流當(dāng)前位置開始讀取改行的內(nèi)容 返回改行的長度 /// </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; }
然后有人會(huì)問了,為啥我不用 StreamReader.readLine()來讀取一行呢?
由于接下來需要修改當(dāng)前行的內(nèi)容,讀取完當(dāng)前行并確定需要修改的時(shí)候,需要把流的位置移動(dòng)至行首,根據(jù)上面函數(shù)得到讀取的長度,使用代碼
fs.Seek(-len, SeekOrigin.Current);
如果用len=StreamReader.readLine(),再移動(dòng)指針,你會(huì)發(fā)現(xiàn)流的位置會(huì)在更后面而不是偏移了len,不知道readLine是不是會(huì)預(yù)讀取,導(dǎo)致你覺得他只讀取了一行,實(shí)際他把流的指針移到后幾行了并且緩存了數(shù)據(jù),再做偏移的時(shí)候 結(jié)果就不對(duì)了 這就是為什么要用上面的方法讀取了;
- 好了,接下來遍歷讀取文件內(nèi)容
long len=0; while((len=readRow(fs)!=-1) { //...... //修改內(nèi)容 //文件指針移動(dòng)至行首 if(true) { fs.Seek(-len, SeekOrigin.Current); byte[] readWriteByte = Encoding.UTF8.GetBytes("Test"); //會(huì)直接把原來內(nèi)容替換 fs.Write(readWriteByte, 0, readWriteByte.Length); //***繼續(xù)往下讀取 直到行尾 把指針移到下一行行首 readRow(fs); //修改完成直接跳出循環(huán),保存文件 break; } }
到此這篇關(guān)于C# 使用 Filestream 修改大文件指定位置數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C# Filestream 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)
本文主要介紹了C#實(shí)現(xiàn)簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C#多線程學(xué)習(xí)之(五)使用定時(shí)器進(jìn)行多線程的自動(dòng)管理
這篇文章主要介紹了C#多線程學(xué)習(xí)之使用定時(shí)器進(jìn)行多線程的自動(dòng)管理,實(shí)例分析了C#使用timer定時(shí)器類實(shí)現(xiàn)針對(duì)多線程的自動(dòng)管理功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡單)
下面小編就為大家分享一篇c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01C#和JavaScript實(shí)現(xiàn)交互的方法
最近做一個(gè)小項(xiàng)目不可避免的需要前端腳本與后臺(tái)進(jìn)行交互。由于是在asp.net中實(shí)現(xiàn),故問題演化成asp.net中jiavascript與后臺(tái)c#如何進(jìn)行交互。2015-05-05DevExpress實(shí)現(xiàn)GridControl列頭繪制Checkbox的方法
這篇文章主要介紹了DevExpress實(shí)現(xiàn)GridControl列頭繪制Checkbox的方法,需要的朋友可以參考下2014-08-08