Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#14

AW: Delphi Datenlogger zerstört CompactFlash (CF) Karten

  Alt 11. Sep 2012, 16:11
Die "richtige" Methode ist wenn man die Datei zum Schreiben öffnet, mit Seek ans Ende geht und dort weiterschreibt.
Was man vermeiden sollte ist den alten Inhalt in eine Stringliste einzulesen, dann Daten anhängen und den gesamten Inhalt wegzuschreiben.
Mit dieser falsche Methode würde man alle Daten, die man bisher geschrieben hat nochmals schreiben (nicht gut für die CF).

Ich habe mal auf die Schnelle eine Hilfsklasse geschrieben, mit der man es besser machen kann.

Delphi-Quellcode:
type
   // Mit dieser Klasse kann man Daten an eine bestehende Datei anhängen
   TAppendFileWriter = class(TObject)
   private
     FStream : TFileStream;
     FFilename : string;
     function GetFilesize: Int64;
   public
     constructor Create(const filename:string);
     destructor Destroy;override;

     procedure WriteString(const s : String);
     procedure WriteLine(const line:string);
     function Flush:Boolean;

     property Filename:string read FFilename;
     property Filesize:Int64 read GetFilesize;
   end;



{ TAppendFileWriter }

constructor TAppendFileWriter.Create(const filename: string);
begin
  inherited Create;
  FStream := TFileStream.Create(filename, fmOpenReadWrite or fmShareDenyWrite);
  FStream.Seek(0, soFromEnd);
end;

destructor TAppendFileWriter.Destroy;
begin
   FStream.Free;
   inherited;
end;

procedure TAppendFileWriter.WriteString(const s: String);
begin
   if s <> 'then
      FStream.WriteBuffer(s[1], Length(s));
end;

procedure TAppendFileWriter.WriteLine(const line: string);
begin
   WriteString(line+#13#10);
end;



function TAppendFileWriter.GetFilesize: Int64;
begin
   Result := FStream.Size;
end;


// Daten sicher schreiben
procedure TAppendFileWriter.Flush;
begin
   if not FlushFileBuffers(FStream.Handle) then
      RaiseLastWin32Error;
end;
Andreas
  Mit Zitat antworten Zitat