Bir programın içine, Opendialog ile seçilen dosyayı açıyorum ve TFileStream ile (Readbuffer) buffer'a okutuyorum. Sonra bir fonksiyon ile örneğin 'Deneme' yazısını arattırıp yerine "Exampl" yazısını koyuyorum. Function True olarak geriye dönüyor ve WriteBuffer ile yazıyı güncelliyorum. İşte burada yazının güncellenmediğini ve aslında başta yüklenen yazısının kaydedildiğini görüyorum. Programda asıl olarak binary dosyaları üzerinde çalışyorum ancak ASCII yada binary olarak yaptığım tüm denemelerde sonuç aynı oldu.
Bu büyük komplike bir programın parçası. Bunun için sadece o kısmı gösteren bir örnek hazırladım.
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
buf1 : string;
Function FileModi(filebuf : string; filelen : integer) : Boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Fstm : TFileStream;
fsize,i, c : integer;
begin
if Opendialog1.Execute then
begin
try
Fstm := TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite);
Fstm.Position := 0;
Fsize := Fstm.Size;
SetLength(buf1,fsize);
Fstm.ReadBuffer(Pointer(buf1)^,fsize);
if FileModi(buf1,fsize) = True then
begin
Fstm.Position :=0;
Fstm.WriteBuffer(Pointer(buf1)^,fsize);
end;
Finally;
end;
Fstm.Free;
end;
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
//--------------------------------------------------------------//
Function FileModi(filebuf : string; filelen : integer) : Boolean;
var
c,i : integer;
s : string;
begin
s := 'Exampl';
try
Result := False;
c:= Pos('Deneme',filebuf);
if c <> 0 then
begin
Form1.Memo1.Lines.Add('Yazı bulundu');
Result := True;
for i := 0 to length(s) do
begin
filebuf[c+i] := s[i];
end;
end;
Finally
end;end;
end.
Bu bir Deneme yazisidir.
Eğer fonksiyon kullanmadan yaparsam istediğim işlem yapılmış olarak kaydediliyor. Ollydebug ile bakınca fonksiyona girdiğinde 2. bir buffer oluşturmuş olduğunu ve işlemi onun üzerinde yaptığını gördüm. FileModi kısmına gönderdiğim buf1 adresi kullanılmıyor ancak aynı data başka bir buffer'da kullanılıyor. Sanırım birşeyler atlıyorum burada ancak ne olduğunu henüz çıkaramadım. Buffer olarak Array denedim fakat sonuç aynı. Sizce buradaki sorun nedir?
Saygılar.