Entwickler-Ecke

Dateizugriff - TFileStream funktioniert nicht


Shmidt_dlt - Mo 02.06.03 16:58
Titel: TFileStream funktioniert nicht
Guten tach auch,

ich hatte vor einiger zeit eine Wahnsinns idee...
ich wollte aus einem Programm heraus eine Datei exportieren und da noch ein Record anhängen. Da dachte ich mir das sich da TFilestream am
günstigsten macht. Funktioniert auch... der export und der import... der Import allerdings nur beim 1. mal danach liest der nur noch schrott in den record und bringt exceptions usw...

Ich hoffe es gibt jemanden der mir helfen kann... wo liegt da der fehler

der Code ist quasi nur mal ein auszug das mit der Datei hab ich mal weggelassen weil das eh funktioniert.. nur der blöde record macht müll

Export:

Delphi-Quelltext
1:
2:
3:
4:
5:
  FInStream:=TFileStream.Create('abc.str',fmCreate);
  with FInStream do begin
     Write(Record,Sizeof(Record));
     Free;
  end;

Import:

Delphi-Quelltext
1:
2:
3:
4:
5:
  FOutStream:=TFileStream.Create('abc.str',fmCreate);
  with FOutStream do begin
     Read(Record,Sizeof(Record));
     Free;
  end;


BungeeBug - Mo 02.06.03 17:09

Hi,
versuch mal beim Import fmReadOpen als Zugriffsmodus :)
dann sollte das schon mal besser gehen ....

MfG BungeeBug

P.S.: Wenn du an den Stream was anhängen willst dann würd ich als Zugriffsmodus fmOpenReadWrite benutzen ... aber das sagt die die OH auch :)


w3seek - Mo 02.06.03 17:15

TFileStream.Create loest eine Exception aus wenn die Datei nicht in dem gewuenschten Modus geoeffnet werden kann, oder die Datei nicht existiert oder sie nicht erstellt werden kann.
Am besten immer in etwa so loesen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
try
  fs := TFileStream.Create(...);
except
  fs := nil;
end;
if Assigned(fs) then begin
  ....
  fs.Free;
end;


Shmidt_dlt - Di 03.06.03 08:04

upsi.. sollte ja auch fmopenread heissen, ein klassicher Copy-Paste-error
ich probier das mal aus...


Shmidt_dlt - Di 03.06.03 08:56
Titel: geht immernoch nciht
Also ich hab jetzt das ganze in zig varianten ausprobiert... funktionieren tut es aber immernoch nicht. wenn ich allerdings statt des Records einen string reinschreibe geht es... sollte aber nicht sinn und zweck der übung sein...

in dem Record sind nur strings und Integer deklariert. deshalb hier mal der komplette code

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:
Function TExcelExImport.ImportTemplate(ImportFile : String; FileName: String): TTemplateRecord;
Var FOutStream,FInStream : TFileStream;
    ExSize,i : LongInt;
begin
  FOutStream:=TFileStream.Create(ImportFile,FmOpenReadWrite and fmShareDenyNone);
  FInStream:=TFileStream.Create(FileName,FmCreate);
  with FOutStream do begin
    Read(ExSize,SizeOf(Longint));
    FInStream.CopyFrom(FOutStream,ExSize);
    Read(Result,Sizeof(Result));
    Result.FileName:=FileName;
    free;
  end;
  FInStream.Free;
end;

Procedure TExcelExImport.ExportTemplate(ExportFile : String; Template: TTemplateRecord);
Var FOutStream,FInStream : TFileStream;
    ExSize : LongInt;
begin
  FOutStream:=TFileStream.Create(Template.Filename,FmOpenReadWrite and fmShareDenyNone);
  FInStream:=TFileStream.Create(ExportFile,FmCreate);
  with FInStream do begin
    ExSize:=FOutStream.Size;
    Write(ExSize,SizeOf(ExSize));
    CopyFrom(FOutStream,FOutStream.Size);
    Write(Template,Sizeof(Template));
    Free;
  end;
  FOutStream.Free;
end;


Moderiert von user profile iconTino: Absätze entfernt & Delphi-Tags eingefügt.


tommie-lie - Di 03.06.03 18:20
Titel: lphi
Was denn für Strings (im record)?
Wenn es "normale" LongStrings sind (als Typ String), dann sind die von variabler Länge und haben soweit ich weiß nur eine Größe von 4 Byte, nämlich die eines Pointers. Beim Schreiben wird das dann zu wenig sein, und beim Lesen erst Recht.
LongString ist so ziemlich der schlechteste Typ um ihn in eine Datei zu schreiben ;-)
Am Besten du nimmst statische Strings, nämlich Shortstrings (Typ: String[123]). Die haben eine fest Länge und sind kein Pointer, machen also keine Probleme beim Schreiben und Lesen in und aus Dateien.
Ansonsten wäre der Inhalt der Datei, zumindest die Stelle an der der Record sein sollte, hilfreich zur Fehleranalyse.