Я использую Filestream для чтения большого файла (> 500 МБ), и я получаю OutOfMemoryException.OutOfMemoryException при чтении 500MB FileStream
Любые решения об этом.
Мой код:
using (var fs3 = new FileStream(filePath2, FileMode.Open, FileAccess.Read))
{
byte[] b2 = ReadFully(fs3, 1024);
}
public static byte[] ReadFully(Stream stream, int initialLength)
{
// If we've been passed an unhelpful initial length, just
// use 32K.
if (initialLength < 1)
{
initialLength = 32768;
}
byte[] buffer = new byte[initialLength];
int read = 0;
int chunk;
while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
{
read += chunk;
// If we've reached the end of our buffer, check to see if there's
// any more information
if (read == buffer.Length)
{
int nextByte = stream.ReadByte();
// End of stream? If so, we're done
if (nextByte == -1)
{
return buffer;
}
// Nope. Resize the buffer, put in the byte we've just
// read, and continue
byte[] newBuffer = new byte[buffer.Length * 2];
Array.Copy(buffer, newBuffer, buffer.Length);
newBuffer[read] = (byte)nextByte;
buffer = newBuffer;
read++;
}
}
// Buffer is now too big. Shrink it.
byte[] ret = new byte[read];
Array.Copy(buffer, ret, read);
return ret;
}
Пожалуйста, что это лучший код, я использую это: http://www.yoda.arachsys.com/csharp/readbinary.html Спасибо господин –
+1: Да, выделяя размер буфера вам нужно это хорошая идея ... на самом деле, я удивлен, что .NET не имеет метода для чтения целого файла в массив байтов или какую-либо другую подобную структуру. – Powerlord
Он делает. File.ReadAllBytes http://msdn.microsoft.com/en-us/library/system.io.file.readallbytes.aspx Но это не то, что должен делать этот плакат. Чтение всех байтов 500-мегабайтного файла в память - это обычно плохая идея *, и в этом случае ... это очень плохая идея. Плакат явно имеет в виду первичную, но неизменную цель, которая не «считывает все байты файла в память». Он * думает * ему нужно прочитать все байты, но это неправда. – Cheeso