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



BeitragVerfasst: So 02.09.07 12:40 
Hallo,

kann man mit TFileStream unter Delphi2006 auch Dateien die größer als 2GB sind öffnen
und bearbeiten?
Welches OS ist braucht man da min. Nehme an ab Win2000 mit NTFS.

Mit welcher Methode würdet Ihr den in so großen Files nach
bestimmten Inhalten (von Strings) durchsuchen, was auch eine gute Geschwindigkeit hat.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var 
  filDatei: TFileStream; 
  byteBuffer: Byte; 
begin 
  filDatei := TFileStream.Create('dieDatei.ext', fmOpenWrite); // Datei öffnen 
  filDatei.Position := 33; // Dateizeiger an die richtige Position fahren (steht am 34. Byte!); 
  byteBuffer := 122; // Das Byte, das geschrieben werden soll 
  filDatei.WriteBufffer(byteBuffer, 1); // Byte schreiben 
  filDatei.Free; // Fertig. FileStream freigeben 
end;


beim Dateien durchsuchen hab ich folgendes gefunden, nur kann man da auch
nach dem Wert 00h suchen?
zB: beim SearchWord, wenn man myfile.exe eingibt das er dann
nach folgenden sucht: 'm' + 00h + 'y' + 00h + 'f' + 00h ....


ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
function FindInFile(const FileName   : string;
                    SearchWord : string; MatchCase : Boolean) : Integer;
var
  fs     : TFileStream;
  Buffer : array [1..10000] of Char;
  Size   : Integer;
  idx    : Integer;
  i      : Integer;
begin
  Result := -1;
  idx := 1;
  if not MatchCase then
   SearchWord := UpperCase(SearchWord);
  fs := TFileStream.Create(FileName, fmopenreadwrite or fmsharedenynone);
  try
    Repeat
      Application.ProcessMessages;
      Size := (Fs.Size - Fs.Position);
      if Size > 10000 then Size := 10000;
      Fs.ReadBuffer(Buffer, Size);
      if not MatchCase then
      begin
        for i := 1 to Size do
          Buffer[i] := Uppercase(Buffer)[i];
      end;
      for i := 1 to Size do
      begin
        if (Buffer[i] = SearchWord[idx]) then
          Inc(idx)
        else
          idx := 1;
        if (idx = Length(SearchWord)) then
        begin
          Result := (fs.Position - Size) + i - idx + 1;
          Exit;
        end;
      end;
    until fs.Position >= fs.Size;
  finally
   fs.Free;
  end;
end;
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: So 02.09.07 13:03 
Ist zwar schon länger her, aber in der c't haben sie genau für dieses Problem (Pattern-suche) diverse Algorithmen vorgestellt welche besser sind als die "übliche 0815"-Suche.
Timosch
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1314

Debian Squeeze, Win 7 Prof.
D7 Pers
BeitragVerfasst: So 02.09.07 13:59 
user profile iconBiarchiv hat folgendes geschrieben:

Welches OS ist braucht man da min. Nehme an ab Win2000 mit NTFS.

FAT32 kann Dateien mit einer Größe von bis zu 4GB verwalten, FAT16 nur 2GB (komischerweise kann man aber unter NT auf FAT16-Partitionen 4GB große Dateien erstellen, ist also offenbar eine Einschränkung von Win9x). NTFS kann momentan bis 16TB...
Grundsätzlich also NT, 98, oder neuer.

_________________
If liberty means anything at all, it means the right to tell people what they do not want to hear. - George Orwell