Entwickler-Ecke

Dateizugriff - TFilestram: programm hängt sich beim lesen der datei auf


mimi - So 10.08.03 19:12
Titel: TFilestram: programm hängt sich beim lesen der datei auf
Hallo,
habe ein arichvererstellt, es funktioniert alles. mit kleinen datenmengen aber sobalt die datei größer als ca 1 MB ist hängt sich das programm auf. warum ?
hier meine entpack funktion

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:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
function TMFa.ExtractFileHeader(Index:Integer):TDateiInfo;
var
  Datei,Datei2, Datei3, Datei4:TStream;
  len,HeaderS,oldPos:Integer;
  DateiHeader:String;
  DL:String;
  x:Integer;
begin
  Datei  := TFileStream.Create(FileName, fmOpenRead, fmOpenRead); // arichvname
  Datei2 := TFileStream.Create(GetExeDir + 'temp\header.tmp', fmCreate); // Header
  Datei3 := TFileStream.Create(GetExeDir + 'temp\' + ExtractFileName(Filename)+'.tmp',fmCreate); // Dateiarichv

  try 
    Datei.Read(Len, SizeOf(Len));
    Datei.Read(PChar(DL)^,len);

    if Index > len then begin
      ShowMessage('Fehler(0): Index(' + IntToStr(Index) + ') ist größer als: ' + IntTostr(Len));
      exit;
    end;

    if Index <= 0 then begin
      ShowMessage('Fehler(0): Index(' + IntToStr(Index) + ') ist zuklein als: 1' );
      exit;
    end;
    HeaderS:=-1;
    oldPos:=-1;

    Datei.Seek(0, soFromBeginning);
    Datei.Read(HeaderS, SizeOf(HeaderS)); // die länge für DL auslesen
    Datei.Read(Len, SizeOf(Len)); // die länge für DL auslesen
    DateiCount:=Len;
    x:=0;
    DL:='';
    SetLength(dl,1);
    while True do begin
      inc(x);
      Datei.Read(PChar(dl)^, 1);
      if dl = '!' then  break;
    end;

    dl:='';
    Datei.Seek(Datei.Position-1,soFromBeginning);
    Len:=-1;
    Datei.Read(Len, SizeOf(Len));
    SetLength(dl,len);
    Datei.Read(PChar(DL)^, Len); // header ein lesen
    index:=index+1;
    oldPos:=Datei.Position;
    Datei.Seek(0,soFromBeginning);
    Datei2.CopyFrom(Datei,HeaderS);
    Datei.seek(oldPos,soFromBeginning);
    HeaderS:=-1;
    Datei.Read(HeaderS,SizeOf(HeaderS));
    Datei3.CopyFrom(Datei,HeaderS);
    Datei.seek(StrToInt(GetToken(GetToken(DL,'|', index),',',1))+4,soFromBeginning);
    len:=StrToInt(GetToken(GetToken(DL,'|', index),',',2));
    SetLength(DateiHeader,Len); // Header länge setzen
    Datei.Read(PChar(DateiHeader)^, Len); // header ein lesen
    Datei.Seek(0,soFromBeginning);
    Datei.Read(Len,SizeOf(Len));

    result.FileName:=GetToken(DateiHeader,';',1);
    result.FileName:=GetToken(DateiHeader,';',1);
    result.CreateDateTime:=StrToDateTime(GetToken(DateiHeader,';',2));
    result.usesDateTime:=StrToDateTime(GetToken(DateiHeader,';',3));
    result.WriteusesDateTime:=StrToDateTime(GetToken(DateiHeader,';',4));
    result.FileSize:=StrToInt(GetToken(DateiHeader,';',5));
    result.FileDes:=GetToken(DateiHeader,';',6);
    result.APos:=StrToInt(GetToken(DateiHeader,';',7));
    result.EndPos:=StrToInt(GetToken(DateiHeader,';',8));
  finally
    Datei.Free;
    Datei2.Free;
    Datei3.Free;
  end;
end;


mimi - Mi 13.08.03 13:13

habe ich gelöst *g*