Autor Beitrag
Biarchiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: So 11.09.05 15:49 
Hey,

ich versuche gerade folgendes vergeblich.
Ich will eine Datei den String "r" durchsuchen lassen.
Wo bei er aber immer bei jeder prüfung um 512 Stellen
nach vor springen soll.
Wenn er es gefunden hat soll er jede weiteren Byte mit 00h
überschreiben 110000 Stellen lang und wieder nach den string "r" suchen.

Aber bei diesen Code ist die Datei plötzlich 0 bytes groß und es hängt.

Form1.Label1.caption ist ein zähler der die Stringstellen angibt.

Kann dieser Code auch bei Dateien über 5GB und bei
WinXP 64Bit verwendet werden?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
sizeprogress : integer;
r,r1,w : string:


begin
if (Form1.CheckBox2.checked = true) then

begin
r := 'YXDERGDF';
w := #00;
sizeprogress := GetFileSize(Form1.Edit1.Text);

imageread := TFileStream.create(Form1.Edit1.Text, fmcreate or fmShareDenyNone);
repeat
imageread.seek(+512, sofromcurrent);
imageread.Read(r1, 8);
Form1.Label1.Caption := IntToStr(imageread.position) + ' / ' + InttoStr(sizeprogress) + ' bytes';
if (r1 = r) then
  begin
  imageread.Write(w, 110000);
  end;
until imageread.Position = sizeprogress - 1000;
imageread.free;
end;
end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 11.09.05 21:56 
Bei fmCreate wird IMMER eine neue Datei angelegt (ähnlich wie Rewrite). fmOpenReadWrite reicht vollkommen.

Zum eigentlichen Fehler...

STRINGS NIE direkt in die Variable lesen:

Er soll nur prüfen, ob das aktuelle Zeichen ein R ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
var C: Char;

FS.Read(C, 1);
If C = 'r' Then DoSomething;


Bzw. bei String-Vergleichen der Länge 8:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var S1, S2: Int64;
var T:String;

T := 'Maske123';
S1 := PInt64(@T[1])^;

FS.Read(S2, 1);
If S1 = S2 Then DoSomething;


Zum Füllen der Datei mit dem #0-Zeichen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var mem: Pointer;
begin
    Mem := GetMem(110000);
    try
        FS.Write(Mem^, 110000);
    finally
        FreeMem(Mem);
    end;
end;


Oder mit strings:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var mem: String;
begin
    Mem := StringOfChar(#0, 110000;
    FS.Write(Mem[1], 110000);
end;


Ansonsten kann man das so machen, geht aber auch effizienter...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.