AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten schrittweise in Textdatei speichern

Ein Thema von Sim_Star · begonnen am 6. Apr 2011 · letzter Beitrag vom 9. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Sim_Star

Registriert seit: 18. Jan 2006
Ort: Krostitz
63 Beiträge
 
#1

Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 07:56
Hallo,

ich frage mich gerade wie ich Daten schrittweise in eine Textdatei speichern kann.
Ich habe vor mir einen eigenen Logger zu programmieren, der mir in meinen Programmen Ereignisse und so weiter aufzeichnet und diese dann speichert.

Nun will ich gerne die Speicherung intern über eine Stringliste vornehmen. Da diese aber immer größer wird will ich diese nach Erreichen einer bestimmten Größe automatisch in eine Textdatei abspeichern, und die interen Liste leeren.

Wie kann man jetzt neue Daten wieder an die Textdatei, also ans Ende anhängen, ohne diese wieder z.b. zuerst in eine Stringliste zu laden?


Für Hilfe bin ich dankbar!

LG Marco
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 08:02
Delphi-Referenz durchsuchenAssignFile
Delphi-Referenz durchsuchenAppend
Delphi-Referenz durchsuchenWriteln
Delphi-Referenz durchsuchenCloseFile
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.226 Beiträge
 
Delphi 12 Athens
 
#3

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 08:32
- FileStream öffnen (wenn Datei nicht existiert, dann eine erstellen)
- Position ans Ende
- StringListe in diesen Stream kopieren (also anhängen)
- StringListe leeren

oder die besagten (alten) Textprozeduren (ala AssignFile und WriteLn)
oder Hier im Forum suchenFileStringList, bzw. Hier im Forum suchenPartialTextfile
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rob74

Registriert seit: 13. Sep 2006
Ort: München
22 Beiträge
 
Delphi XE Starter
 
#4

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 08:45
Darf ich fragen, warum Du die Log-Messages in eine StringList speichern willst und erst in einem zweiten Schritt in eine Datei? Direkt in die Datei wäre deutlich einfacher (siehe: KISS-Prinzip), und hätte noch den Vorteil, dass die Daten in der Datei immer den aktuellen Zustand des Programms widerspiegeln, wenn das Programm z.B. abstürzt, kommst Du u.U. nicht mehr dazu, die Daten in die Datei zu speichern. Langsamer wird das Programm dadurch nicht, die Datei wird ja nicht bei jedem Aufruf direkt auf die Festplatte geschrieben, die diversen Caches auf Betriebssystems- und Festplattenebene federn das ab...

Geändert von rob74 ( 6. Apr 2011 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 09:08
@himi: ja stimmt, diese konvertiererei dieser Urzeitunits macht mich total Kirre...
Aber ich hab hier noch eine andere Variante, die dich bestimmt interessiert

Delphi-Quellcode:
function SetFilePointer(hFile: Cardinal; lDistanceToMove: Longint; lpDistanceToMoveHigh: Pointer;
                        dwMoveMethod: Cardinal): Cardinal; stdcall; external kernel32 name 'SetFilePointer';

function FileExists(const FileName: string; const PFileSize: PInt64 = nil): Boolean; {$IFDEF Inln}inline;{$ENDIF}
var
  myFile: Cardinal;
  myFindData: TWin32FindData;
  TheInt64: Int64;
begin
  myFile := FindFirstFile(@FileName[1], myFindData);
  Result := myFile <> INVALID_HANDLE_VALUE;
  if Result then
  begin
    FindClose(myFile);
    if PFileSize <> nil then
    begin
      TheInt64 := PFileSize^;
      Int64Rec(TheInt64).Lo := myFindData.nFileSizeLow;
      Int64Rec(TheInt64).Hi := myFindData.nFileSizeHigh;
      PFileSize^ := TheInt64;
    end;
  end;
end;

function OpenFile(const FileName: string; var hFile: Cardinal; const PFileSize: PInt64 = nil): Boolean; {$IFDEF Inln}inline;{$ENDIF}
begin
  Result := FileExists(FileName, PFileSize);
  if Result then
  begin
    hFile := CreateFile(@FileName[1], GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
    Result := hFile <> INVALID_HANDLE_VALUE;
  end;
end;

function WriteFileStr(const hFile: Cardinal; const AStr: string): Boolean; {$IFDEF Inln}inline;{$ENDIF}
var
  Size, BytesWritten: Cardinal;
begin
  Size := Length(AStr)*SizeOf(Char);
  Result :=
    (WriteFile(hFile, AStr[1], Size, BytesWritten, nil)) and
    (Size = BytesWritten);
end;

function AddTextToFile(const Text, FilePath: string): Boolean; {$IFDEF Inln}inline;{$ENDIF}
var
  hFile: Cardinal;
  fs: UInt64;
begin
  Result := false;
  if not OpenFile(FilePath, hFile, @fs) then
    Exit;
  if SetFilePointer(hFile, fs+Length(Text)*SizeOf(Char), nil, FILE_BEGIN) = fs+Length(Text)*SizeOf(Char) then
  begin
    SetEndOfFile(hFile);
    Result :=
      (SetFilePointer(hFile, fs, nil, FILE_BEGIN)=fs) and
      WriteFileStr(hFile, Text);
  end;
  CloseHandle(hFile);
end;
  Mit Zitat antworten Zitat
shmia

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

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 10:35
function FileExists(const FileName: string; const PFileSize: PInt64 = nil): Boolean; {$IFDEF Inln}inline;{$ENDIF}
Diese Funktionen sind viel zu groß um um Inline kompiliert irgendeinen Sinn zu ergeben.
Ich kann nur empfehlen, diese Inline-Klauseln komplett wegzulassen!
Wenn man ausserdem noch bedenkt, dass der Zugriff auf Dateien Milliardenfach mehr Zeit benötigt als mit einer Inline-Funktion gespart werden könnte....
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.226 Beiträge
 
Delphi 12 Athens
 
#7

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 12:47
Und solange die Log-Datei kleiner als 2 GB bleibt und man kein Unicode benötigt, funktionieren die alten Pascal-Datei-Funktionen auch noch ganz gut.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Daten schrittweise in Textdatei speichern

  Alt 6. Apr 2011, 12:50
@shmia:
Dafür gibts ja den Direktivenschalter.
Aber welchen Nachteil bekommt Entwickler und Anwender (außer der größeren Exe) doch gleich?
  Mit Zitat antworten Zitat
Maik81ftl

Registriert seit: 31. Mär 2011
Ort: Wahlstedt
26 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Daten schrittweise in Textdatei speichern

  Alt 8. Apr 2011, 22:03
Hallo,

ich frage mich gerade wie ich Daten schrittweise in eine Textdatei speichern kann.
Ich habe vor mir einen eigenen Logger zu programmieren, der mir in meinen Programmen Ereignisse und so weiter aufzeichnet und diese dann speichert.

Nun will ich gerne die Speicherung intern über eine Stringliste vornehmen. Da diese aber immer größer wird will ich diese nach Erreichen einer bestimmten Größe automatisch in eine Textdatei abspeichern, und die interen Liste leeren.

Wie kann man jetzt neue Daten wieder an die Textdatei, also ans Ende anhängen, ohne diese wieder z.b. zuerst in eine Stringliste zu laden?


Für Hilfe bin ich dankbar!

LG Marco
schaut nach 'ner Log-file aus

sry a wan i sowas sehe, bekomm ich 'nen Anfall von

Da ich selber auch sowas betreibe, würde ich auf diese version verweisen.

Delphi-Quellcode:
procedure Messwerterfassung(Messwert: String; Count: Longint);
var s: String;
begin
  fFilename:= Format('%s%s', [fPath, fExt]);
  if fFileName <> 'then
     begin
     with TIniFile.Create(fFileName) do try
       s := Format('[%s%s]', [fName, fLastname]);
       WriteString(s, 'Messwert' + IntToStr(Count), Messwert));
     finally
       Free;
     end;
  end;
end;
Würde dir anbieten eine klasse dafür zu coden.
Die Definition eine Bibliothek ist bei mir eine *.so
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Daten schrittweise in Textdatei speichern

  Alt 8. Apr 2011, 22:34
Eine Ini-Datei als Log-Datei?

Der 1. April ist doch schon vorbei (hier wenigstens).

Bitte nicht - da kriegt man ja Schüttelfrost
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz