C # - Создание байтового массива неизвестного размера? - PullRequest
4 голосов
/ 24 декабря 2011

Я пытаюсь создать класс для управления открытием определенного файла.Я хотел бы, чтобы одно из свойств было байтовым массивом файла, но я не знаю, насколько большим будет файл.Я попытался объявить байтовый массив как:

public byte[] file;

... но он не позволит мне установить его так, как я пытался.br - мой BinaryReader:

file = br.ReadBytes(br.BaseStream.Length);

br.Read(file,0,br.BaseStream.Length);

Ни один из способов не работает.Я предполагаю, что это потому, что я не инициализировал свой байтовый массив, но я не хочу давать ему размер, если я не знаю размер.Есть идеи?

edit: Хорошо, я думаю, это потому, что длина BaseStream двоичного считывателя велика, но его читатели берут int32.Если я приведу 64-ые к 32-ым, возможно ли потерять байты в больших файлах?

Ответы [ 3 ]

5 голосов
/ 24 декабря 2011

У меня не было проблем с чтением файлового потока:

 byte[] file;
 var br = new BinaryReader(new FileStream("c:\\Intel\\index.html", FileMode.Open));
 file = br.ReadBytes((int)br.BaseStream.Length);

Ваш код не компилируется, поскольку свойство Length в BaseStream имеет тип long, но вы пытаетесь использовать его как int.Неявное приведение, которое может привести к потере данных, не допускается, поэтому вы должны привести его к явному int. Обновление Просто имейте в виду, что приведенный выше код призван подчеркнуть вашу первоначальную проблему и не должен использоваться как есть.В идеале вы должны использовать буфер для чтения потока кусками.Посмотрите на этот вопрос и решение, предложенное Джоном Скитом

1 голос
/ 24 декабря 2011

BinaryReader.ReadBytes возвращает байт [].Нет необходимости инициализировать массив байтов, потому что этот метод уже делает это внутренне и возвращает вам полный массив.

Если вы хотите прочитать все байты из файла, вКласс файла:

http://msdn.microsoft.com/en-us/library/system.io.file.readallbytes.aspx

0 голосов
/ 24 декабря 2011

Вы не можете создать массив неизвестного размера.

byte []file=new byte[br.BaseStream.Length];

PS: вам придется многократно читать куски байтов для больших файлов.

...