2011-12-24 3 views
4

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

public byte[] file; 

... но это не позволит мне установить его пути я пытался. br is my BinaryReader:

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

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

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

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

+0

Чтобы ответить на ваш второй вопрос, файлы должны быть больше, чем два гигабайты, прежде чем это станет проблемой. –

+0

@RobertHarvey - в то время как true, поскольку это ограничение, налагаемое средой выполнения, может стать проблемой со значительно меньшими файлами из-за давления памяти на машине. – codekaizen

+0

@Walkerneo - Обратите внимание, что подпись этого метода позволяет сделать меньший массив, скажем, 4096 байт, а затем вызывать его в цикле, в то время как результат метода 'Read' совпадает с количеством байтов, попросил. – codekaizen

ответ

4

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

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

Ваш код не компилируется, так как длина свойство BaseStream имеет тип long но вы пытаетесь использовать его в качестве int. Неявное литье, которое может привести к потере данных, не допускается, поэтому вы должны явно указать его на int.
Update
Просто имейте в виду, что выше код призван подчеркнуть вашу исходную задачу и не должны использоваться, как это. В идеале вы должны использовать буфер для чтения потока в кусках. Посмотрите на this question and the solution suggested by Jon Skeet

0

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

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

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

1

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

Если вы хотите, чтобы прочитать все байты из файла, есть удобный метод в классе File:

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

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