[GELÖST] Text an bestehende Dateien anhängen

15. Januar 2019 14:30

Hallo zusammen,

Text an bestehende Dateien anzuhängen sollte mit den SEEK und LEN Membern von File-Variablen eigentlich kein Problem sein. Verwende ich unter NAV 2016 nur die Methoden der File Variable, habe ich das NULL Zeichen Problem. NAV hängt mir dann das Zeichen NULL an jede geschriebene Textzeile an. Arbeite ich dagegen mit Streams, funktioniert das Schreiben zwar ohne das NULL Zeichen Problem, doch der Dateizeiger ist im Stream offensichtlich nicht ausgereichtet. Als Ergebnis überschreibe ich jedes Mal Daten, anstelle die neuen Daten ans Dateiende anzuhängen. Früher ging das sogar direkt mit einer File-Variable ohne Probleme, doch da gab es auch noch nicht das NULL Zeichen Problem.

Eine andere Variante wäre vielleicht, direkt .NET Klassen zu verwenden. Muss ich diesen Ansatz zwingend verwenden, oder bekomme ich das auch mit den Standard NAV Bordmitteln per File-Variable und Outstream-Variable hin?

Vielleicht hat hier im Forum jemand eine Idee. Ich poste mal meinen bisherigen Quelltext:
Code:
WriteNoteToFile(Filename : Text;MessageText : Text;WriteTimestamp : Boolean)
CLEAR(OutFile);
CLEAR(OStream);
OutFile.WRITEMODE := TRUE;

CRLF := '  ';
CRLF[1] := 13;
CRLF[2] := 10;

IF EXISTS(Filename) THEN BEGIN
  OutFile.OPEN(Filename, TEXTENCODING::Windows);
  OutFile.SEEK(OutFile.LEN);
END ELSE
  OutFile.CREATE(Filename, TEXTENCODING::Windows);
OutFile.CREATEOUTSTREAM(OStream);

IF WriteTimestamp THEN
  OStream.WRITETEXT(STRSUBSTNO('%1 %2 %3', TODAY, TIME, MessageText))
ELSE
  OStream.WRITETEXT(MessageText);
OStream.WRITETEXT(CRLF);

OutFile.CLOSE;


Lokale Variablen der Funktion:
Code:
OutFile: File
CRLF: Text[2]
OStream: OutStream


Gruß,
Marc
Zuletzt geändert von TSO_MB am 17. Januar 2019 09:48, insgesamt 1-mal geändert.

Re: Text an bestehende Dateien anhängen

15. Januar 2019 14:46

Hallo,

hast du schon mal
Code:
OutFile.TEXTMODE := TRUE

vor dem öffnen probiert?

Gruß Fiddi

Re: Text an bestehende Dateien anhängen

17. Januar 2019 09:46

Hallo Fiddi,

sorry für die späte Antwort. Habe irgendwie keine E-Mail bekommen und jetzt mal auf "Thema beobachten" geklickt.

Habe Deinen Vorschlag ausprobiert. Das ist jetzt ganz interessant:
Mit Streams funktioniert auch diese Variante nicht. Allerdings habe ich auch mal folgendes in einer separaten Funktion "WriteNoteToFile3" probiert:
Code:
WriteNoteToFile3(Filename : Text;MessageText : Text;WriteTimestamp : Boolean)
CLEAR(OutFile);
OutFile.WRITEMODE := TRUE;
OutFile.TEXTMODE := TRUE;

CRLF := '  ';
CRLF[1] := 13;
CRLF[2] := 10;

IF EXISTS(Filename) THEN BEGIN
  OutFile.OPEN(Filename, TEXTENCODING::Windows);
  OutFile.SEEK(OutFile.LEN);
END ELSE
  OutFile.CREATE(Filename, TEXTENCODING::Windows);

IF WriteTimestamp THEN
  OutFile.WRITE(STRSUBSTNO('%1 %2 %3', TODAY, TIME, MessageText))
ELSE
  OutFile.WRITE(MessageText);
OutFile.WRITE(CRLF);

OutFile.CLOSE;
Aufruf:
Code:
WriteNoteToFile3('c:\temp\TestFile_direkt.txt', 'Testnachricht4', TRUE);
Ergebnisdatei (Datei vorher gelöscht und Funktion danach dreimal ausgeführt):
Code:
17.01.19 08:28:26 Testnachricht4


17.01.19 08:28:35 Testnachricht4


17.01.19 08:28:42 Testnachricht4


Das NULL-Problem ist bei direkter Verwendung ohne Streams im Textmode offenbar nicht mehr vorhanden. Dafür macht CRLF nun Probleme. Ich habe das letzte WRITE mit dem CRLF auskommentiert und danach funktionierte es ohne Probleme. Interessant ist jedoch, dass Streams offensichtlich überhaupt nicht von SEEK beeinflusst werden. Aber so funktioniert es und wenn die Datei nicht zu groß wird, hilft das auch weiter. Vielen Dank für den Tipp.

Gruß
Marc