![]() |
Einzelnen Unicodestring an Datei anhängen
Hallo liebe Delphianer
nach langer Zeit der Überlegung bin ich nun endlich von Delphi7 auf DelphiXE umgestiegen. Ich bin jetzt dabei alle Projekte und Komponenten auf Unicode umzustellen und dabei bin ich auf ein kleines Problem getroffen für das ich etwas Hilfe benötigen würde. In meinen alten Projekten schreibe ich Logfiles welche bei den Kunden teilweise eine Grösse von mehreren GB erreichen können. Alter Code:
Code:
Soweit so gut. Aber jetzt zu mein Problem:Procedure TFComponentTest.WriteLogline(const szFile, szLogline : string); var F1 : textfile; begin AssignFile(F1, szFile); TRY if (FileExists(szFile) = TRUE) then begin Append(F1); end else begin Rewrite (F1); end; writeln (F1, szLogline); FINALLY Closefile (F1); END; end; Ich muss jetzt z.B folgenden String in die Logdatei schreiben Ģenerē vieną įmonė читаете вы его! ÆàëîáûÎáñëóæèâàíèå Als Übergangslösung für diese Kriksikraksi-Zeichen habe ich jetzt folgendes Implementiert:
Code:
Das funktioniert soweit auch recht gut. Nur die Performanze geht mir dabei total in den Keller, da ich bei jeden einzelnen Logeintrag die Datei neu einlesen muss.
Procedure TFComponentTest.WriteLogline1(const szFile, szLogline : string);
var aFileList : TStringlist; Encoding : TEncoding; begin TRY aFileList := TStringlist.Create; if (FileExists(szFile) = TRUE) then begin aFileList.LoadFromFile(szFile); end; aFileList.Text := aFileList.Text + szLogline; aFileList.SaveToFile(szFile, Encoding.Unicode); FINALLY aFileList.Free; END; end; Habt Ihr eine Idee wie ich dieses Problem ev. mit WriteLn lösen könnte? MfG Pit |
AW: Einzelnen Unicodestring an Datei anhängen
Könntest Du nicht einen StringStream mit dem gewünschten Encoding erzeugen und dessen DataString dann an die Datei anhängen?
|
AW: Einzelnen Unicodestring an Datei anhängen
Wenn man Performance wünscht, sollte man wohl einen TFileStream nehmen. StringStreams, StringLists, etc. laden die ganze Datei halt sinnlos in den Arbeitsspeicher.
|
AW: Einzelnen Unicodestring an Datei anhängen
Wer hat denn etwas von Datei laden gesagt? Ich meinte: StringStream erzeugen mit dem gewünschten String und Encoding. Dann Datei öffnen (Rewrite bzw. Append) und mit writeln den String aus dem Stream schreiben.
|
AW: Einzelnen Unicodestring an Datei anhängen
DataString eines TStringStreams ist immer UTF-16 - egal was man als Encoding einstellt?!
Ich würde den String einfach so in "rohe Bytes" umwandeln:
Delphi-Quellcode:
TEncoding.UTF8.GetBytes('Ein beliebiger Text.')
Zitat:
|
AW: Einzelnen Unicodestring an Datei anhängen
Achso, ich dachte, Du beziehst Dich auf mich.
|
AW: Einzelnen Unicodestring an Datei anhängen
Delphi-Quellcode:
Writeln(F1, UTF8Encode(szLogline));
|
AW: Einzelnen Unicodestring an Datei anhängen
*Pff* viel zu einfach, da könnte ja jeder kommen :lol:
|
AW: Einzelnen Unicodestring an Datei anhängen
Zitat:
|
AW: Einzelnen Unicodestring an Datei anhängen
Du kannst eine Zeile an eine Logdatei z.B. so anhängen:
Delphi-Quellcode:
const CRLF : string = #13#10 ; procedure AddToLog(LogFile: string; Msg: string); var FLogStream: TStream; begin if (not FileExists(LogFile)) then begin ForceDirectories(ExtractFilePath(LogFile)) ; FLogStream:= TFileStream.Create(LogFile,fmCreate); end else begin FLogStream:= TFileStream.Create(LogFile,fmOpenReadWrite); end; FLogStream.Seek(0,soFromEnd) ; Msg := Msg + CRLF ; FLogStream.Write(Pointer(Msg)^,Length(Msg)*SizeOf(Char)) ; FreeAndNil(FLogStream) ; end; |
AW: Einzelnen Unicodestring an Datei anhängen
[Letztes OT]
![]() |
AW: Einzelnen Unicodestring an Datei anhängen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute
danke für die schnellen Antworten. Habe auf die schnelle folgendes versucht:
Code:
Was mache ich da falsch bzw. wie hänge ich einen Stringstream korrekt an eine bestehende Datei an?
szFile := 'Logfile.log';
szLogline := 'Ģenerē vieną įmonė читаете вы его! ÆàëîáûÎáñëóæèâàíèå'; // funktioniert aFileList := TStringlist.Create; if (FileExists(szFile) = TRUE) then aFileList.LoadFromFile(szFile); aFileList.Text := aFileList.Text + szLogline; aFileList.SaveToFile(szFile, Encoding.Unicode); aFileList.Free; // funktioniert nicht AssignFile(F1, szFile); Append(F1); aStream := TStringStream.Create(szLogline, Encoding.Unicode); writeln (F1, aStream.DataString); Closefile (F1); aStream.Free; //funktioniert auch nicht AssignFile(F1, szFile); Append(F1); writeln (F1, UTF8Encode(szLogline)); Closefile (F1); In den ersten 2 Bytes der Datei steht FFFE = UTM16(LE) durch ".SaveToFile(szFile, Encoding.Unicode) Das Resultat habe ich angehängt MfG Pit |
AW: Einzelnen Unicodestring an Datei anhängen
Unabhängig vom eigentlichen Problem: Du brauchst keine nutzlose Variable vom Typ TEncoding anzulegen. Du kannst einfach
Delphi-Quellcode:
schreiben :wink:
TEncoding.Unicode
|
AW: Einzelnen Unicodestring an Datei anhängen
Nochmals danke für die zahlreichen Beiträge
Problem durch die Routine von blackfin gelöst. Funktioniert tadellos und Performanze ist auch perfekt! Besten Dank an alle MfG Pit |
AW: Einzelnen Unicodestring an Datei anhängen
Trotzdem würde ich die Routine noch ein wenig ändern (ungetestet, Denkfehler vorbehalten):
Delphi-Quellcode:
procedure AddToLog(const LogFile: string; Msg: string);
const Modes: array[Boolean] of word = (fmOpenReadWrite, fmCreate); var FLogStream: TStream; begin ForceDirectories(ExtractFilePath(LogFile)); try FLogStream := TFileStream.Create(LogFile, Modes[FileExists(LogFile)] or fmShareDenyWrite); try FLogStream.Seek(0, soFromEnd) ; Msg := Msg + sLineBreak; FLogStream.Write(Pointer(Msg)^, Length(Msg) * SizeOf(Char)) ; finally FLogStream.Free; end; except on E: Exception do MessageBox(0, PChar(E.Message), nil, MB_OK or MB_ICONERROR); end; end; |
AW: Einzelnen Unicodestring an Datei anhängen
AssignFile und Co. arbeitet immer nur mit ANSI - UnicodeStrings werden entsprechend umkodiert.
Du könntest als erstes (beim Erstellen der Datei, als AnsiString) den UTF-8-BOM einfügen und dann immer (wie schon von Stevie vorgeschlagen) über UTF8Encode abspeichern. Oder man kopiert den UnicodeString, zusammen mit einem sLinebreak, Bytegenau in einen RawByteString und schiebt diesen via AssignFile+Write (nicht WriteLn) in die Datei. Oder man öffnet die Datei binär und nimmt BlockWrite, bzw. über einen TFileStream und dort ebenfalls binär, wie im vorherigen Post zu sehn. Oder TFileStream erstellen, die Position auf das Dateiende setzen und dann über TStringStream dort den String anhängen. |
AW: Einzelnen Unicodestring an Datei anhängen
Ich habe das jetzt so gelöst:
Code:
MfG Pit
if (not FileExists(szFile)) then begin
ForceDirectories(ExtractFilePath(szFile)) ; aList.SaveToFile(szFile, TEncoding.Unicode); end else begin TRY FLogStream:= TFileStream.Create(szFile, fmOpenReadWrite or fmShareDenyWrite); FLogStream.Seek(0, soFromEnd); szLogline := aList.Text; FLogStream.Write(Pointer(szLogline)^, Length(szLogline)*SizeOf(Char)); FINALLY FreeAndNil(FLogStream); END; end; |
AW: Einzelnen Unicodestring an Datei anhängen
Du solltest das Erzeugen des FileStreams vor das try setzen.
|
AW: Einzelnen Unicodestring an Datei anhängen
Und
Delphi-Quellcode:
kann auch nicht schaden ... Casts über PChar, PAnsiChar und PWideChar erzeugen notfalls noch eine Compiler-Warnung, falls der String nicht zum PChar-Typen paßt, also zu den gewollten binären Daten im Zeiger.
FLogStream.Write(PChar(szLogline)^,
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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