2014-09-29 2 views
2

Я хочу заменить некоторые данные в файле, однако я не знаю точно, где этот 200MB-файл будет содержать его. Можно ли найти (и заменить их чем-то еще) этими значениями без загрузки в память файла 200mb +?Найти и заменить данные в файле (без загрузки всего объекта)?

+2

Какой файл? – alykins

+0

@alykins Файл будет, к сожалению, являться .exe. То, что я пытаюсь сделать, - это процесс «исправления». – Pixelspace

+0

Вы на 100% уверены, что exe? Как exe будет хранить данные? – alykins

ответ

3

Поиск файла не представляет проблемы. Вам нужно работать с FileStream, доступным с помощью метода File.Open. Вы можете прочитать файл до байтов, которые нужно заменить. Проблема возникает, когда вам нужно что-то вставить. FileStream позволяет вам перезаписать некоторые или все содержимое файла с определенного байта вперед и добавить новый контент в его конец, но он не позволяет вставлять данные в середине файла. Чтобы преодолеть эту проблему, вам понадобится временный файл. Если вы согласны с этим, можете сделать следующее:

  1. Открыть FileStream в исходном файле.
  2. Создайте временный файл, который будет содержать черновик.
  3. Поиск по исходному файлу и копирование всех «хороших» данных во временный файл до момента, когда необходимо внести изменения.
  4. Вставьте измененные и новые данные во временный файл.
  5. Завершите временный файл оставшимся «хорошим» контентом из исходного файла.
  6. Замените исходный файл на временный.
  7. Удалить временный файл.

Вы можете использовать метод Path.GetTempFileName для удобства использования временного файла.

P.S. Если вы изменяете exe, вы, вероятно, делаете замену текстовых констант, и вам не нужно вставлять новые байты или удалять какие-либо. В таком случае вам не нужно беспокоиться о временном файле, и FileStream - это все, что вам нужно.

P.P.S. Работая с FileStream, вы определяете размер буфера, который вы читаете из файла, и записываете обратно. Имейте в виду, что этот размер является компромиссом между потреблением памяти, производительностью ввода-вывода и сложностью вашего кода. Выбирай с умом. Я бы сделал это за каждый байт в первый раз и попытался оптимизировать увеличение буфера, чтобы сказать 64k, когда он работает. Вы можете рассчитывать на FileStream для буферизации данных; он не выполняет операции ввода/вывода с диска каждый раз, когда вы запрашиваете у него другой байт. Если вы погрузитесь в буферизацию самостоятельно, попробуйте не фрагментировать Large Object Heap. Порог для .NET 4.5 составляет 85000 байт.

+1

Alykins, вы ошибаетесь. Файлы - это просто хранилище двоичных данных.Неважно, что такое содержимое, и не имеет значения, какое расширение имени файла вы можете свободно работать с содержимым файла. –

+0

Cool-Я никогда не знал, что вы можете изменить исполняемый файл с помощью этого метода доступа. Я пытался найти документацию так или иначе, но я буду доверять, потому что ваш ответ кажется на вопрос. – alykins

1

Просто подумайте, как насчет чтения файла по строкам или может быть в куске байтов и видеть в каждом фрагменте, если у вас есть данные, которые необходимо заменить. Кроме того, во время чтения убедитесь, что указатель файла до тех пор, пока вы не прочитали файл, так что, когда u найдет совпадение, вы можете вернуться в это место и записать эти точные байты, на которые вы нацелились.

+0

Возможно, это сработает. Exe, скорее всего, сломается, но открытие кусков - вариант, который я думаю ... – Pixelspace

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