Читать большой исполняемый файл c # - PullRequest
0 голосов
/ 08 августа 2011

На моем HD-диске есть файл размером около 1 ГБ. Я хотел бы прочитать этот файл в байтовом массиве. Проблема заключается в том, что Visual Studio создает исключение System.OutOfMemoryException. Есть ли способ обработки файла такого размера в байтовом массиве? Мне нужно это в байтовом массиве, потому что я хотел бы добавить данные в определенные части файла и затем записать добавленные данные обратно на мой HD.

Спасибо, Evan

Ответы [ 4 ]

3 голосов
/ 08 августа 2011

Вы не должны читать весь файл сразу в байтовый массив. Прочитать файл кусками

InputStream is = new FileInputStream(some file);
// Create the byte array to hold the data
byte[] bytes = new byte[Somelength];

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) 
{
    offset += numRead;

    //do whatever you want do do with byes
}

// Ensure all the bytes have been read in
if (offset < bytes.length) 
{
   throw new IOException("Could not completely read file "+file.getName());
}
1 голос
/ 09 августа 2011

Если вы запускаете .NET4, вы MemoryMappedFile класс может быть полезен в подобных ситуациях.

Это полезно, если вы работаете на 64-битном процессоре, в противном случае вы должны иметь скользящий просмотр данных (64-битное адресное пространство может легко вместить 1 ГБ)

1 голос
/ 08 августа 2011

Если вам нужно вставить данные в середину файла, я предлагаю вам создать новый файл. Чередуйте копирование данных из исходного файла и вставку новых данных. Нет необходимости хранить много этого в памяти одновременно.

Копирование определенного «чанка» должно быть простым:

public static void CopyChunk(Stream input, Stream output, int size)
{
    byte[] buffer = new byte[16 * 1024];
    while (size > 0)
    {
        int bytesRead = input.Read(buffer, 0, Math.Min(size, bufer.Length));
        if (bytesRead == 0)
        {
            // Or just return if you want - it depends on how you want to handle
            // the situation.
            throw new IOException("Not enough input data");
        }
        output.Write(buffer, 0, bytesRead);
        size -= bytesRead;
    }
}
0 голосов
/ 08 августа 2011

Чтение части, проверка ее, добавление дополнительных байтов при необходимости, запись в новый файл. Повторяйте, пока все не будет обработано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...