成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#讀取文件信息的三個(gè)步驟

開發(fā) 后端
C#讀取文件信息是我們項(xiàng)目開發(fā)中經(jīng)常遇到的問題,比如讀取配置文件、讀取用戶提交的文本等,流是讀取文件的一般手段;本文將向您介紹C#讀取文件信息簡單有效的三個(gè)步驟。

在通常的C#開發(fā)中,你是怎么通過C#讀取文件信息的?C#給我們提供了非常強(qiáng)大的類庫(又一次吹捧了.NET一番),里面封裝了幾乎所有我們可以想到的和我們沒有想到的類,流是讀取文件的一般手段,使用流讀取。是的沒錯(cuò),那么你真的會(huì)用它讀取文件中的數(shù)據(jù)了么?真的能讀完全么?

通常我們使用C#讀取文件信息使用如下的步驟:

1、聲明并使用File的OpenRead實(shí)例化一個(gè)文件流對(duì)象,就像下面這樣

FileStream fs = File.OpenRead(filename);

或者

FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

2、準(zhǔn)備一個(gè)存放文件內(nèi)容的字節(jié)數(shù)組,fs.Length將得到文件的實(shí)際大小,就像下面這樣

byte[] data = new byte[fs.Length];

3、開始讀了,調(diào)用一個(gè)文件流的一個(gè)方法讀取數(shù)據(jù)到data數(shù)組中

fs.Read (data, 0, data.Length);

我們只寫了3句就可以用C#讀取文件信息,而且里面的內(nèi)容原封不動(dòng)的讀出來,真是太簡潔了!可以這段代碼真的能像你預(yù)期的那樣工作么?答案是:幾乎可以!

在大部分情況下上面的代碼工作的很好,但是我們應(yīng)該注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的寫法完全可以是一個(gè)沒有返回值的函數(shù)。我想返回值的目的是,為了給我們一個(gè)機(jī)會(huì)判斷實(shí)際讀取文件的大小,從而來判斷文件是否已經(jīng)完全讀完。所以上面的代碼不能保證我們一定讀完了文件里面的所有字節(jié)(雖然在很多情況下是讀完了)。下面的方法提供了一個(gè)比上面方法更安全的方法,來保證文件被完全讀出。

  1. public static void SafeRead (Stream stream, byte[] data){  
  2.    int offset=0;  
  3.    int remaining = data.Length;  
  4.    // 只要有剩余的字節(jié)就不停的讀  
  5.    while (remaining > 0){  
  6.    int read = stream.Read(data, offset, remaining);  
  7.    if (read <= 0)  
  8.    throw new EndOfStreamException("文件讀取到"
    +read.ToString()+"失敗!");  
  9.    // 減少剩余的字節(jié)數(shù)  
  10.    remaining -= read;  
  11.    // 增加偏移量  
  12.    offset += read;  
  13.    }  
  14.   } 

有些情況下你不知道流實(shí)際的長度比如:網(wǎng)絡(luò)流。此時(shí)可以使用類似的方法讀取流直到流里面的數(shù)據(jù)完全讀取出來為止。我們可以先初始化一段緩存,再將流讀出來的流信息寫到內(nèi)存流里面,就像下面這樣:

  1. public static byte[] ReadFully (Stream stream){  
  2.    // 初始化一個(gè)32k的緩存  
  3.    byte[] buffer = new byte[32768];  
  4.    using (MemoryStream ms = new MemoryStream())
    //返回結(jié)果后會(huì)自動(dòng)回收調(diào)用該對(duì)象的Dispose方法釋放內(nèi)存  
  5.    // 不停的讀取  
  6.    while (true){  
  7.    int read = stream.Read (buffer, 0, buffer.Length);  
  8.    // 直到讀取完最后的3M數(shù)據(jù)就可以返回結(jié)果了  
  9.    if (read <= 0)  
  10.    return ms.ToArray();  
  11.    ms.Write (buffer, 0, read);  
  12.    }  
  13.    }  
  14.   } 

雖然上面實(shí)現(xiàn)C#讀取文件信息的例子都比較簡單,效果也不是很明顯(大部分都是對(duì)的),也許你早就會(huì)了,沒關(guān)系這篇文章本來就是寫給初學(xué)者的。

再來看一段代碼示例:

  1. public static byte[] Read2Buffer (Stream stream, int BufferLen){  
  2.    // 如果指定的無效長度的緩沖區(qū),則指定一個(gè)默認(rèn)的長度作為緩存大小  
  3.    if (BufferLen < 1){  
  4.    BufferLen = 0x8000;  
  5.    }  
  6.    // 初始化一個(gè)緩存區(qū)  
  7.    byte[] buffer = new byte[BufferLen];  
  8.    int read=0;   
  9.    int block;  
  10.    // 每次從流中讀取緩存大小的數(shù)據(jù),知道讀取完所有的流為止  
  11.    while ( (block = stream.Read(buffer, 
    read, buffer.Length-read)) > 0){  
  12.    // 重新設(shè)定讀取位置  
  13.    read += block;  
  14.      
  15.    // 檢查是否到達(dá)了緩存的邊界,檢查是否還有可以讀取的信息  
  16.    if (read == buffer.Length){  
  17.    // 嘗試讀取一個(gè)字節(jié)  
  18.    int nextByte = stream.ReadByte();  
  19.      
  20.    // 讀取失敗則說明讀取完成可以返回結(jié)果  
  21.    if (nextByte==-1){  
  22.    return buffer;  
  23.    }  
  24.      
  25.    // 調(diào)整數(shù)組大小準(zhǔn)備繼續(xù)讀取  
  26.    byte[] newBuf = new byte[buffer.Length*2];  
  27.    Array.Copy(buffer, newBuf, buffer.Length);  
  28.    newBuf[read]=(byte)nextByte;  
  29.    buffer = newBuf;// buffer是一個(gè)引用(指針),
    這里意在重新設(shè)定buffer指針指向一個(gè)更大的內(nèi)存
     
  30.    read++;  
  31.    }  
  32.    }  
  33.    // 如果緩存太大則使用ret來收縮前面while讀取的buffer,然后直接返回  
  34.    byte[] ret = new byte[read];  
  35.    Array.Copy(buffer, ret, read);  
  36.    return ret;  
  37.   } 

上面的方法提供了一種使用指定緩存長度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長度,但是不是所有的流都可以得到。通過這樣的方法,我們可以輕松實(shí)現(xiàn)C#讀取文件信息的簡潔和完整性。

 

【編輯推薦】

  1. C#讀取資源文件
  2. C#讀取圖片的EXIF信息
  3. C#讀取TXT文件的代碼實(shí)現(xiàn)
  4. C#讀取二進(jìn)制文件淺析
  5. C#讀取XML節(jié)點(diǎn)內(nèi)容方法實(shí)例簡析
責(zé)任編輯:佚名 來源: 王朝網(wǎng)絡(luò)
相關(guān)推薦

2009-08-03 13:43:02

C#日歷控件

2009-08-06 11:00:19

C#對(duì)象的使用

2009-08-20 12:35:41

C#讀取圖片的EXIF

2022-08-29 10:15:56

首席信息官IT領(lǐng)導(dǎo)者可持續(xù)業(yè)務(wù)

2022-05-12 12:55:28

容器Kubernetes運(yùn)行容器

2021-08-19 11:22:22

深度學(xué)習(xí)編程人工智能

2019-01-29 07:14:41

2022-10-12 14:33:15

數(shù)字化轉(zhuǎn)型網(wǎng)絡(luò)安全數(shù)據(jù)中心

2021-01-15 10:51:32

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2010-08-02 23:40:42

Linux NFS

2009-08-13 09:32:00

C#讀取TXT文件

2009-08-21 16:13:27

C#讀取資源文件

2009-08-13 17:22:15

C#數(shù)據(jù)集

2009-08-12 18:29:06

C#讀取TXT文件

2010-11-15 09:56:30

2022-04-15 09:30:00

Kubernetes云計(jì)算多云

2020-07-20 09:20:44

云計(jì)算云安全數(shù)據(jù)

2010-06-28 13:40:22

SNMP協(xié)議服務(wù)

2021-10-12 09:23:29

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2019-05-05 10:11:27

數(shù)據(jù)中心效率DCIM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: av日韩高清 | a成人| 成人免费一级 | 国产精品国产三级国产aⅴ无密码 | 欧美在线资源 | 精品一区二区三区免费视频 | h片在线观看免费 | 国产欧美一区二区三区国产幕精品 | 在线午夜 | 亚洲精品乱码久久久久久久久久 | 丝袜久久| 久草视| av影音资源 | 久久久久久久久久久久亚洲 | 日韩一区二区三区在线 | 国产日韩欧美另类 | 男人的天堂中文字幕 | 亚洲成人自拍 | 久久国产高清视频 | 看毛片的网站 | 亚洲免费在线 | 香蕉婷婷 | 久久久久免费 | 久久国产精品首页 | 久久久久无码国产精品一区 | 精品丝袜在线 | 日韩精品在线看 | 国产亚洲精品久久yy50 | 91精品国产美女在线观看 | 国产精品视频中文字幕 | 九九九久久国产免费 | 美女艹b| 日韩一区二区在线看 | 成人精品在线观看 | 国产在线资源 | 玖玖视频 | 国产ts人妖一区二区三区 | 久久免费小视频 | 人人干人人玩 | 欧美在线观看一区 | 欧美精品一 |