2016-08-12 2 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 
} 

Так как же я прочитал весь поток без использования цикла? Спасибо, буду признателен за любую помощь. Я должен прочитать все данные в буфер, а затем написать его. Извините, я не упоминал об этом раньше.

EDIT: Вы можете использовать этот код, а также прочитать поток в буфер сразу:

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);' then? –

0

Предполагая, что файл содержит текст, то вы можете использовать для чтения потока и просто передать в вашем FileStream конструктору (ниже я создаю новый FileStream, чтобы открыть файл):

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

'StreamReader' предназначен для текста. Нет никаких указаний на то, что файл OP является текстовым файлом. – adv12

+0

Спасибо, добавив комментарий к этому вопросу. Предполагая, что кодирование известно, строка может быть легко преобразована в массив байтов. –

+0

Да, я хочу прочитать поток из веб-ответа. @ adv12 –

0

Из documentation на Stream.Read:

Возвращаемое значение

Тип: System.Int32

Общее количество байтов, считанных в буфер. Это может быть меньше количества запрошенных байтов, если количество байтов в настоящий момент недоступно, или нуль (0), если конец потока достигнут.

Таким образом, для Stream.Read это абсолютно законно, чтобы читать меньше длины буфера, если это говорит о том, что это было сделано.

+0

Да, я согласен. Мне просто интересно, как это сделать за один раз. @ adv12 –

Смежные вопросы