2013-04-24 48 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

如果它是一个大的文件;然后阅读大块应该可能帮助

相关问题