Как я могу работать с большим файлом в C#?

Я хочу работать с большим файлом .ISO на С#. Я хочу манипулировать им, добавляя и удаляя из него файлы, и создавать из него новый iso. Я попробовал библиотеку DiscUtils, но, похоже, я не могу заставить ее работать. Когда я загружаю его (используя стандартные функции С#), я всегда получаю исключение OutOfMemoryException. Это 600 МБ ISO (более или менее), и у меня 2 ГБ оперативной памяти.

В настоящее время я делаю это:

                FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.Read);
                BinaryReader b = new BinaryReader(fs);


                byte[] buffer = b.ReadBytes((int)fs.Length);




                int count;                            // actual number of bytes read
                int sum = 0;
                while ((count = b.Read(buffer, (int)sum, (int)(buffer.Length - sum))) > 0)
                {
                    sum = sum + count;  // sum is a buffer offset for next reading
                }

Он выдает OutOfMemoryException в "byte[] buffer = b.ReadBytes((int)fs.Length);". Когда я удаляю/добавляю материал в ISO, я могу загружать его по частям или это должен быть весь файл?

ОБНОВЛЕНИЕ 1: я ограничил буфер:

FileStream fs = new FileStream(FileDialog.FileName, FileMode.Open, FileAccess.Read,FileShare.Read,4096);

Но все равно ничего.

Как я могу работать с этим?


person riahc3    schedule 14.11.2012    source источник
comment
Более мелкими кусками. Обычно вам не нужны все данные в памяти одновременно.   -  person ipavlic    schedule 14.11.2012
comment
Вам нужен большой файл в формате byte[] или вы хотите прочитать содержимое файла .ISO?   -  person dtb    schedule 14.11.2012
comment
Вы, вероятно, получаете OutOfMemoryException, потому что читаете слишком много байтов за раз. Используя FileStream, вы сможете прочитать небольшой фрагмент (например, 4096 байт), записать его в новый файл, прочитать следующий фрагмент и так далее.   -  person Eren Ersönmez    schedule 14.11.2012
comment
@dtb Я читал, что лучше всего использовать массив байтов (байт []), поэтому я загрузил его в этот ErenErsönmez. Как я могу читать небольшие фрагменты, но при этом проверять MD5?   -  person riahc3    schedule 14.11.2012
comment
Если все, что вы хотите сделать, это вычислить MD5, то вам вообще не нужно загружать байты. Просто передайте Stream экземпляру MD5.   -  person dtb    schedule 14.11.2012
comment
@dtb Вот чем я сейчас занимаюсь; Позже, как я уже упоминал, я буду манипулировать файлами внутри .ISO, например, перечислять, удалять, добавлять и т. д. Меньше всего меня беспокоит MD5.   -  person riahc3    schedule 14.11.2012
comment
Я уже рассчитал. Теперь мне просто нужно изменить ISO, что является основной проблемой.   -  person riahc3    schedule 14.11.2012
comment
Дело в том, что нужно было изменить ISO… Я мог бы быть небрежным, если бы не смог рассчитать MD5.   -  person riahc3    schedule 14.11.2012
comment
Кажется, я не могу загрузить его... Ошибки памяти все еще существуют.   -  person riahc3    schedule 20.11.2012


Ответы (2)



файлы, отображаемые в память, позволяют эффективно работать с файлами, которые слишком большой, чтобы жить в памяти.

person Nicolas Repiquet    schedule 14.11.2012
comment
Николя Репике, я тоже читал об этом и проверял, но я считаю, что библиотека DiscUtils не может его использовать, так что об этом не может быть и речи.... - person riahc3; 14.11.2012