Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Пропатчить двоичный файл - заменить строку

Delphi , Файловая система , Файлы

Пропатчить двоичный файл - заменить строку


// Replaces a string in a file with new string. 
// Ersetzt eine Zeichenkette in einer Datei mit einer anderen Zeichenkette. 

procedure TForm1.Button1Click(Sender: TObject); 
var 
  f: file; 
  l: Longint; 
  FileName, oldstring, newstring, s: string; 
begin 
  oldstring := 'old string'; 
  newstring := 'new string'; 
  FileName  := 'c:\YourFileName.xyz'; 
   
  s := oldstring; 
  AssignFile(f, FileName); 
  Reset(f, 1); 
  for l := 0 to FileSize(f) - Length(oldstring) - 1 do 
  begin 
    Application.ProcessMessages; 
    Seek(f, l); 
    BlockRead(f, oldstring[1], Length(oldstring)); 
    if oldstring = s then 
    begin 
      Seek(f, l); 
      BlockWrite(f, newstring[1], Length(newstring)); 
      ShowMessage('String successfully replaced!'); 
    end; 
    Application.ProcessMessages; 
  end; 
  CloseFile(f); 
end;

Перевод контента на русский язык:

Предлагается процедура на языке Pascal, которая заменяет конкретную строку на другую в двоичном файле. Код работает следующим образом:

  1. Сначала присваивается имя файла и старой/новой строк.
  2. Файл открывается в режиме чтения с помощью AssignFile и Reset.
  3. Затем проходит по каждому байту в файле (используя FileSize - Length(oldstring) - 1) для поиска вхождения старой строки.
  4. Когда она находит совпадение, она перемещается назад к этому положению и записывает новую строку над старой с помощью BlockWrite.
  5. Наконец, файл закрывается с помощью CloseFile.

Вот некоторые предложения по улучшению:

  • Код использует Application.ProcessMessages, что может быть неэффективно, поскольку оно заставляет приложение обрабатывать сообщения от других компонентов в то время, когда оно проходит по файлу.
  • Код предполагает, что файл слишком маленький для хранения в памяти. Если файл слишком велик, более эффективным будет чтение его частями и замена строк на месте.
  • Обработка ошибок минимальна. Могло бы быть хорошим идеей проверить, существует ли файл перед попыткой открыть его.

Вот альтернативное решение с использованием TStreamReader и TStreamWriter, которое может обрабатывать большие файлы:

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName, oldstring, newstring: string;
begin
  oldstring := 'old string';
  newstring := 'new string';
  FileName := 'c:\YourFileName.xyz';

  try
    AssignFile(FileName);
    Reset(FileName);

    var reader := TStreamReader.Create(FileName, System.TextEncoding.UTF8);
    var writer := TStreamWriter.Create(FileName, True, System.TextEncoding.UTF8);

    while not reader.EndOfStream do
    begin
      var line := reader.ReadLine;
      if Pos(oldstring, line) > 0 then
        writer.WriteLine(StringReplace(line, oldstring, newstring))
      else
        writer.WriteLine(line);
    end;

    CloseFile(FileName);
  except
    on E: Exception do
      ShowMessage('Error while processing file: ' + E.Message);
  end;
end;

Код читает файл строка за строкой и заменяет старую строку на новую. Он использует TStreamReader для чтения файла и TStreamWriter для записи модифицированных строк обратно в файл. Этот подход более эффективен для больших файлов и также правильно обрабатывает кодировку.

Программа на Pascal, позволяющая заменить строку в двоичном файле на новую строку.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 20:01:43/0.0035650730133057/0