![]() |
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 04:54 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