日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#?使用?Filestream?修改大文件指定位置數據_C#教程

作者:i聽音樂的猿 ? 更新時間: 2022-11-19 編程語言

前言

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;
    }
}

原文鏈接:https://juejin.cn/post/7113913157524914190

欄目分類
最近更新