![]() |
Re: Log-Datei realisieren
Nach nochmaligem Studiums der Delphi-Hilfe möchte ich einfach mal ins blaue rein behaupten, dass das Verhalten sogar gewollt ist und keinen Delphi-Fehler darstellt. Aber lest selbst:
Zitat:
Beim schreibenden Zugriff finde ich es jedoch schon sinnvoll, dass immer nur EINE Instanz auf eine Datei zugreifen kann. Und mir fällt leider auch kein sinnvolles Beispiel ein, bei dem ein andres Verhalten - so wie von dir gewünscht - einen Sinn ergibt. Kannst du mir eines nennen? Wieder anders ist es, wenn eine Instanz schreibend, eine zweite lesend die Datei öffnen will, das müsste man fast mal ausprobieren, wie Delphi sich dort verhält, jedoch ist das für meinen Anwendungsfall ja irrelevant. |
Re: Log-Datei realisieren
Zitat:
ich programmiere zwar schon solange Pascal wie es das gibt, aber ich würde nie behaupten, alles zu wissen - z.B. welche File Modes Delphi ohne Anweisung setzt; ich benutze praktisch ausschliesslich Win32 für File-Operationen (in dem Fall OpenFile), weil da alles einstellbar ist und Windows das dann auch so macht wie ich es wollte. Aber das nur nebenbei, zunächst bin ich ja von deiner Fragestellung ausgegangen, weil du der Meinung warst, der Code in deinem Posting Nr. 1 funktioniere nicht, aber: Wenn das alles so automatisch funktioniert wie zuletzt in den Postings beschrieben, dann hattest du doch vom ersten Posting an überhaupt kein Problem - oder sehe ich das auch falsch? Eine Meinung noch dazu: die Ur-Pascal-Routinen Reset usw. haben den Anschluss an die Neuzeit weitgehend verpasst, das wurde durch Ergänzungen wie FileMode auch nur unzureichend repariert - kann auch nicht sein, damals gab es noch keine Lese-, Schreibrechte usw. Ich ersetze daher alle noch vorhandenen Aufrufe bei Gelegenheit durch die BS-Aufrufe wie OpenFile, WriteFile usw., damit hätte ein grosser Teil der Diskussion garnicht entstehen können. Das würde ich auch so weiterempfehlen. Gruss Reinhard |
Re: Log-Datei realisieren
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Für deinen Rat, vielleicht doch besser auf die Funktionen der Win32-API zurückzugreifen, bin ich dir angesichts der entstandenen Probleme und Unklarheiten jedoch dankbar. Ist vielleicht doch der bessere Weg (siehst du, ich bin ganz und gar nicht beratungsresistent!). Könntest du mir vielleicht schonmal verraten, welche Funktionen ich da für mein Vorhaben alle benötige (außer OpenFile und WriteFile)? |
Re: Log-Datei realisieren
Ich glaube ich hab das schon öfters geschrieben und muss es wohl immer wieder tun:
Die Funktionen AssignFile(), Rewrite(), CloseFile(), readln(), writeln() stammen aus den Anfängen von Pascal und sind daher veraltet. Aus heutiger Sicht sind sie sogar eine Fehlkonstruktion. Begründung: Dateizugriff ist eine Aufgabe der Laufzeitbibliothek und darf nicht zum Sprachumfang einer höheren Progsprache selber gehören. Ausserdem sind diese Funktionen gepuffert was heutzutage aber ein Nachteil ist, da das OS eh schon puffert. Also Finger weg von den alten Funktionen und stattdessen Streams verwenden!! |
Re: Log-Datei realisieren
Zitat:
|
AW: Re: Log-Datei realisieren
Zitat:
Hey ich hab mal ne Frage. Auf die Art und Weise habe ich noch nie in eine Datei geschrieben, daher die Frage. Meine Logdatei hat vor jedem Zeichen einen NUL Charakter. Ist das normal? Bzw. geht das mit der Funktion auch anders? Sieht sehr bescheiden aus. Man kann quasi nix lesen. :( |
AW: Log-Datei realisieren
@ shmia:
Besten Dank, die Klasse kannte ich noch nicht... Hab' bis jetzt immer 'ne TStringlist genommen, da das sehr viel einfacher ist als die Einzelbefehle... Brauche in Kürze eh mal öfter'n MemoryStream, da bietet sich das komplette Stream-Thema ja eigentlich an. |
AW: Re: Log-Datei realisieren
Zitat:
Grüße |
AW: Log-Datei realisieren
Die #0 stört nicht, aber dass der halbe Text fehlt ist vielleicht etwas schlimmer. :zwinker: (seit Delphi 2009)
Jupp, die bösen Jugendsünden bestrafen Einen immer wieder. :oops: Einfach aus String ein AnsiString machen und aus #13#10 ein sLineBreak. Und da wir "nette" Programmierer sind, wird auch noch aus GENERIC_WRITE, 0 ein GENERIC_WRITE, FILE_SHARE_READ. Die WinAPI hatte hier den Vorteil, daß die Fehlerbehandlung etwas "sanfter" reagiert, also vorallem ohne Exceptions. |
AW: Log-Datei realisieren
Nun, es musste natürlich wieder schnell gehen, und das hier hatte ich mit als erstes gefunden :D
Und da der Code von himitsu war, hab ich ihn genommen. Aktuell nutze ich den Code hier von Luckie:
Delphi-Quellcode:
Welcher ist denn nun besser?
function WriteLog(LogFile, LogString: String): Integer;
var f: TextFile; begin {$IOCHECKS OFF} AssignFile(f, LogFile); if FileExists(LogFile) then Append(f) else Rewrite(f); Writeln(f, LogString); CloseFile(f); Result := GetLastError(); {$IOCHECKS ON} end; Wie shmia oben schreibt sollte man solchen Code heute nicht mehr nutzen, da es bessere Wege gibt. Zur Erklärung: Ich schreibe ein kleines Tool um Prime95 fernzusteuern und lasse alle 30 Sekunden die Kerntemperaturen speichern. Dafür brauche ich die Logfunktion |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz