Как пропатчить по трем смещениям несколько файлов по нажатию кнопки? - C#
Формулировка задачи:
В папке есть 55 файлов. Надо сделать, чтоб по нажатию кнопки, произошло умножение значений сразу в 55 файлах по трем смещениям 0x330, 0x340, 0x350, на значение, которое написали в numericUpDown2 (например умножение на 1.5). (В некоторых файлах нужно пропатчивать только по одному или двум смещениям, а не по трем как в большинстве).
Подсказали что надо: Считываешь файл в массив байт, заменяешь нужные и перезаписываешь файлы. Если имена файлов известны, то можно прям в коде имена указать. (Имена файлов: scene1, scene2 и т.д.)
Заметка: Данные в файлах в перевернутом шестнадцетиричном виде. Например 100 000 (десятичное) четырехбайтное значение выглядит в файле: A0 86 01 00, а не 00 01 86 A0. Делается это для упрощения редактирования. Редактирование вручную занимает от 19 до 30 часов, (около трех дней по 7 часов). Потому что есть 6 таких показателей по трем смещениям в 256 файлах, а это 256 * 3 * 6 = 4608 редактирований.
Решение задачи: «Как пропатчить по трем смещениям несколько файлов по нажатию кнопки?»
textual
Листинг программы
static unsafe void PatchFiles()
{
long[] offsets = {0x330, 0x340, 0x350};
byte[] buf4 = new byte[4];
double mulitplyBy = 1.5;
foreach (string fileName in Directory.EnumerateFiles(@"c:\SomeFolder", "scene*"))
{
using (var fstream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
foreach (long offset in offsets)
{
if (offset+4 < fstream.Length)
{
fstream.Position = offset;
fstream.Read(buf4, 0, 4);
int n = (int)(mulitplyBy * BitConverter.ToInt32(buf4, 0));
fixed(byte* b = buf4)
{
*((int*)b) = n;
}
fstream.Position -= 4;
fstream.Write(buf4, 0, 4);
}
}
}
}
}