2013-04-24 20 views
0

我有C#代碼讀取文本文件並打印出來,看起來像這樣:如何找到沒有。字節的文本文件沒有讀取它?

StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName)); 
byte[] buffer = new byte[100]; //is there a way to simply specify the length of this to be the number of bytes in the file? 
sr.BaseStream.Read(buffer, 0, buffer.Length); 

foreach (byte b in buffer) 
{ 
     label1.Text += b.ToString("x") + " "; 
} 

反正是有,我可以知道我的文件有多少字節了?

我想事先知道byte[] buffer的長度,這樣在Read函數中,我可以簡單地傳入buffer.length作爲第三個參數。

+0

可能重複的[獲取Streamreader的長度](http://stackoverflow.com/questions/14637517/get-length-of-streamreader) – asawyer 2013-04-24 12:10:28

+0

順便說一句,如果它的一個小文本文件讀取數據最簡單的方法就是'System.IO.File.ReadAllText(文件名)'http://msdn.microsoft.com/en-us/library/system.io.file.readalltext.aspx – asawyer 2013-04-24 12:24:05

回答

6

目前尚不清楚爲什麼你要使用StreamReader如果你要讀取二進制數據。改用FileStream即可。您可以使用Length屬性來查找文件的長度。

但是,請注意,這仍然不意味着您應該致電Read,並且*假設一次調用將讀取所有數據。你應該循環,直到你讀到的一切:

byte[] data; 
using (var stream = File.OpenRead(...)) 
{ 
    data = new byte[(int) stream.Length]; 
    int offset = 0; 
    while (offset < data.Length) 
    { 
     int chunk = stream.Read(data, offset, data.Length - offset); 
     if (chunk == 0) 
     { 
      // Or handle this some other way 
      throw new IOException("File has shrunk while reading"); 
     } 
     offset += chunk; 
    } 
} 

注意,這是假設你做讀取數據。如果您不想打開該流,請使用FileInfo.Length,如其他答案所示。請注意,FileStream.LengthFileInfo.Length的類型都是long,而數組僅限於32位長度。你想要一個大於2演出的文件發生什麼?

+0

I' d想象你想用'FileShare.None'或'.Read'打開流,以避免文件大小從你的讀腳下突然出現,對嗎? – asawyer 2013-04-24 12:16:24

+0

當有許多讀取和寫入文件的方式 - BinaryReader,BinaryWriter,StreamReader,StreamWriter和現在這個我從來不知道的FileStream時,它真的讓人困惑。感謝你的回答。 – 2013-04-24 12:22:08

+1

@asawyer:可能。這取決於你是否想檢測或防止它... – 2013-04-24 12:34:24

8
System.IO.FileInfo fi = new System.IO.FileInfo("myfile.exe"); 
long size = fi.Length; 

爲了找到文件大小,系統必須從磁盤讀取數據。因此,上述示例執行從磁盤讀取的數據,但不讀取文件內容。

0

我會想象在這裏應該有所幫助。

我懷疑你可以搶先猜測文件的大小,而不閱讀它...

How do I use File.ReadAllBytes In chunks

如果它是一個大的文件;然後閱讀大塊應該可能幫助