2016-08-12 34 views
2

如何在不使用循环的情况下读取文件流?当我使用此代码只读取5714个字节,而不是1048576个字节FileStream.Read - 在不使用循环的情况下读取流

byte[] Buffer = new byte[1048576]; 
ByteSize = downloadstream.Read(Buffer, 0,Buffer.Lenght); 

如果我用这个循环正常工作

while ((ByteSize = downloadstream.Read(Buffer, 0, Buffer.Length)) > 0) 
{ 
    //write stream to file 
} 

那么我将如何读,而无需使用一个循环的整个流? 谢谢,将不胜感激任何帮助。 我必须将所有数据读入缓冲区然后写入。对不起,我之前没有提到过。

编辑:您可以使用此代码,以及读流入缓冲区一次:

using (var streamreader = new MemoryStream()) 
      { 
       stream.CopyTo(streamreader); 
       buffer = streamreader.ToArray(); 
      } 
+0

在您的顶级代码片段中,您声明了一个名为'DownloadBuffer'的缓冲区,但是您可以读入另一个缓冲区,一个名为'Buffer'的缓冲区。这是一个错字,还是实际上你的程序看起来如何?此外,'Buffer.Lenght'是一个错字。我会编辑你的问题,但我想知道你首先想要什么。 – adv12

回答

2

如果你想阅读整个文件一气呵成,我建议使用File.ReadAllBytes二进制文件:

byte[] data = File.ReadAllBytes(@"C:\MyFile.dat"); 

而且File.ReadAllText/File.ReadAllLines文本的:

string text = File.ReadAllText(@"C:\MyFile.txt"); 

string[] lines = File.ReadAllText(@"C:\MyOtherFile.txt"); 

编辑:在网页的情况下

byte[] data; 

    using (WebClient wc = new WebClient()) { 
    wc.UseDefaultCredentials = true; // if you have a proxy etc. 

    data = wc.DownloadData(myUrl); 
    } 

myUrl@"https://www.google.com"我有data.Length == 45846

+0

我想读一个httpwebresponse。我已更新该帖子。 –

+0

@Dinindu Perera:你在寻找'byte [] data = new WebClient()。DownloadData(url);'那么? –

0

假设你的文件包含的文本,那么你可以使用流阅读器,只是通过在FILESTREAM的构造函数(下面我创建了一个新的FileStream打开文件):

using(StreamReader reader = new StreamReader(new FileStream("path", FileMode.Open))) 
     { 
      string data = reader.ReadToEnd(); 
     } 
+0

'StreamReader'用于文本。没有迹象表明OP的文件是文本文件。 – adv12

+0

谢谢 - 为此添加评论。假设编码已知,字符串可以很容易地转换为字节数组。 –

+0

是的,我想从Web响应中读取文件流。 @ adv12 –

0

documentationStream.Read

返回值

类型:System.Int32

读入缓冲区的字节的总数。如果很多字节当前不可用,这可能小于请求的字节数;如果已到达流的末尾,则可以为零(0)。

因此,看起来Stream.Read读取小于缓冲区长度是完全合法的,只要它告诉你它是这样做的。

+0

是的,我同意。我只是想知道如何去做。 @ adv12 –

相关问题