亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#文件流讀寫和進度回調示例詳解

2019-10-29 21:02:58
字體:
來源:轉載
供稿:網友

前言

前不久遇到一個問題,是公司早期的基礎庫遇到的,其實很低級,但是還是記錄下來。出錯點是一個 IO 流的寫入bug,我們項目會有一種專有的數據格式,這個格式的奇葩點在于如果設置 IO 讀緩沖區為 2014 字節的時候,整個文件剛好能讀完,也就是說其 length 剛好是 1024 的倍數。后來在一次升級中增加了更多的文件格式,并且新的文件格式使用了新的自定義寫入流,具有加密和壓縮的作用,這樣一來,文件的長度就不一定是 1024 的倍數了。

后來通過查看這個基礎類的源代碼發現因為是 .NET 2.0 時代的東西,也沒有 Stream.Copy 的方法,于是當時的程序員手動寫了個 Stream.Copy 的方法,我稍作改動為了更直觀將輸出流改為輸出到文件,代碼大概如下:

var fs_in = System.IO.File.OpenRead(@"C:/3.0.6.apk");var fs_out = System.IO.File.OpenWrite(@"C:/3.0.6.apk.copy");byte[] buffer = new byte[1024];while (fs_in.Read(buffer,0,buffer.Length)>0){ fs_out.Write(buffer, 0, buffer.Length);}Console.WriteLine("復制完成");

所以一眼就能看出這個方法簡直有天大的 bug ,假設文件長度不為 1024 的倍數,永遠會在文件尾部多補充上一段的冗余數據。

C#,文件流讀寫,c,回調

這里整整多出了 878 字節的數據,導致整個文件都不對了,明顯是基礎知識都沒學好。

增加一個變量保存實際讀取到的字節數,改為如下:

var fs_in = System.IO.File.OpenRead(@"C:/迅雷下載/3.0.6.apk");var fs_out = System.IO.File.OpenWrite(@"C:/迅雷下載/3.0.6.apk.copy");byte[] buffer = new byte[1024];int readBytes = 0;while ((readBytes= fs_in.Read(buffer, 0, buffer.Length)) >0){ fs_out.Write(buffer, 0, readBytes);}Console.WriteLine("復制完成");

對于處理大型文件,一般都有進度指示,比如處理壓縮了百分多少之類的,這里我們也可以加上,比如專門寫一個方法用于文件讀取并返回 byte[] 和百分比。

static void ReadFile(string filename,int bufferLength, Action<byte[],int> callback){ if (!System.IO.File.Exists(filename)) return; if (callback == null) return; System.IO.FileInfo finfo = new System.IO.FileInfo(filename); long fileLength = finfo.Length; long totalReadBytes = 0; var fs_in = System.IO.File.OpenRead(filename); byte[] buffer = new byte[bufferLength]; int readBytes = 0; while ((readBytes = fs_in.Read(buffer, 0, buffer.Length)) > 0) {  byte[] data = new byte[readBytes];  Array.Copy(buffer, data, readBytes);  totalReadBytes += readBytes;  int percent = (int)((totalReadBytes / (double)fileLength) * 100);  callback(data, percent); }}

調用就很簡單了:

static void Main(string[] args){ string filename = @"C:/3.0.6.apk"; var fs_in = System.IO.File.OpenRead(filename); long ttc = 0; ReadFile(filename, 1024, (byte[] data, int percent) =>  {  ttc += data.Length;  Console.SetCursorPosition(0, 0);  Console.Write(percent+"%"); }); Console.WriteLine("len:"+ttc); Console.ReadKey();}

這是基于文件讀取的,稍微改一下就可以改成輸入流輸出流的,這里就不貼出來了。文件讀寫非常耗時,特別是大文件,IO 和 網絡請求都是 “重操作”,所以建議大家 IO 都放在單獨的線程去執行。C# 中可以使用 Task、Thread、如果同時有多個線程需要執行就用 ThreadPool 或 Task,Java 或 Android 中用 Thread 或線程池,以及非常流行的 RxJava 等等 ...

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久免费精品| 国产盗摄xxxx视频xxx69| 社区色欧美激情 | 日韩av手机在线观看| 欧美在线精品免播放器视频| 欧洲亚洲女同hd| 日韩中文字在线| 中文字幕av一区二区| 国产婷婷色综合av蜜臀av| 欧美国产日韩xxxxx| 亚洲人成77777在线观看网| 亚洲色图17p| 久久久久久久国产精品| 国产精品激情av电影在线观看| 成人在线激情视频| 国产精品观看在线亚洲人成网| 日本成熟性欧美| 亚洲精品成人久久久| 日韩精品在线影院| 91精品国产九九九久久久亚洲| 91精品国产自产在线老师啪| 精品久久久久久久久久ntr影视| 2021久久精品国产99国产精品| 欧美性在线视频| 91精品国产91久久久久久最新| 这里只有精品视频在线| 欧美午夜女人视频在线| 国产日韩换脸av一区在线观看| 欧美综合第一页| www.欧美精品一二三区| 超在线视频97| 亚洲理论在线a中文字幕| 亚洲精品理论电影| 国产ts人妖一区二区三区| 国产精品久久久久久久久借妻| 欧美成年人视频网站欧美| 国产精品老女人精品视频| 国产又爽又黄的激情精品视频| 久久天天躁狠狠躁夜夜躁2014| 精品爽片免费看久久| 97色在线观看免费视频| 亚洲春色另类小说| 国产精品第3页| 日产精品99久久久久久| 欧美日韩国产精品一区| 日韩精品在线免费播放| 中文字幕亚洲自拍| 国产精品久久久久久亚洲影视| 在线播放日韩专区| 成人性生交大片免费看小说| 欧美日韩中文字幕在线| 欧美国产激情18| 国产精品福利在线| 精品亚洲va在线va天堂资源站| 狠狠躁夜夜躁人人爽天天天天97| 久久精品视频在线| 久久久久久国产精品久久| 国产又爽又黄的激情精品视频| 91免费国产视频| 久久久人成影片一区二区三区| 亚洲欧美在线免费观看| 精品国产自在精品国产浪潮| 亚洲图片制服诱惑| 欧美激情免费看| 久久电影一区二区| 久久久人成影片一区二区三区观看| 国产99久久精品一区二区| 日韩av网址在线观看| 久久精品国产成人精品| 欧美日韩国产在线看| 成人欧美一区二区三区在线湿哒哒| 亚洲国产精久久久久久| xxxxxxxxx欧美| 久久亚洲影音av资源网| 亚洲白拍色综合图区| 91在线无精精品一区二区| 成人欧美一区二区三区在线| 国语对白做受69| 国产精品日韩电影| 国产精品久久中文| 色偷偷偷亚洲综合网另类| 精品久久久999| 成人看片人aa| 55夜色66夜色国产精品视频| 欧美日韩在线免费| 久久精品国产亚洲7777| 成人激情视频在线观看| 国产精品久久97| 欧美与黑人午夜性猛交久久久| 亚洲成色www8888| 日韩电影中文字幕在线| 国产91精品在线播放| 国产成人亚洲综合91| 国产精品久久久久久久电影| 亚洲国产精品热久久| 九九精品视频在线| 麻豆一区二区在线观看| 亚洲精品91美女久久久久久久| 在线看福利67194| 亚洲成avwww人| 中文字幕一区日韩电影| 成人黄色大片在线免费观看| 欧美电影免费在线观看| 欧美二区在线播放| 中文字幕九色91在线| 欧美黑人xxx| 俺去了亚洲欧美日韩| 欧美激情亚洲自拍| 欧美日韩国产一区二区| 亚洲人成在线免费观看| 欧美成人午夜剧场免费观看| 性欧美亚洲xxxx乳在线观看| 激情成人在线视频| 久久久999国产精品| 在线精品播放av| 久久亚洲精品一区| 狠狠躁夜夜躁人人躁婷婷91| 亚洲国产日韩欧美在线99| 欧美国产日韩一区二区在线观看| 国产精自产拍久久久久久| 国产美女久久精品香蕉69| 成人激情电影一区二区| 亚洲男人的天堂网站| 日韩av最新在线观看| 国产精品亚洲欧美导航| 97精品欧美一区二区三区| 一区二区在线视频播放| 亚洲综合日韩中文字幕v在线| 黄色精品一区二区| 亚洲va欧美va国产综合久久| 97精品国产91久久久久久| 国产一区欧美二区三区| 国产欧美久久一区二区| 成人免费观看网址| 亚洲成av人片在线观看香蕉| 日韩a**站在线观看| 欧美视频中文在线看| 国产suv精品一区二区三区88区| 国产精品视频不卡| 欧美在线观看www| 国产ts人妖一区二区三区| 亚洲国产精久久久久久| 亚洲毛茸茸少妇高潮呻吟| 国产69精品久久久| 欧美日韩激情美女| 国产99在线|中文| 国产日本欧美一区二区三区在线| 黑人巨大精品欧美一区免费视频| 欧美激情亚洲综合一区| 欧美成年人视频| 日韩在线视频免费观看| 亚洲精品国产精品国产自| 国产剧情久久久久久| 美女性感视频久久久| 高跟丝袜一区二区三区| 92国产精品久久久久首页| 4k岛国日韩精品**专区| 国产精品久久久久久久av大片| 国产一区二区三区在线观看网站| 亚洲精品国产综合区久久久久久久| 欧美富婆性猛交| 午夜精品一区二区三区在线视频| 97免费中文视频在线观看| 91香蕉嫩草神马影院在线观看|