![]() |
Re: Zeilenweise in Datei Schreiben
Das Zeichen unter Windows zum Trennen von verzeichnissen und dateien ist der "\" und nicht der "/", dass auch der "/" funktioniert liegt an der Verspieltheit der damaligen DOS Entwickler bei Microsoft, die etwas Unix like haben wollten. Man sollte aber nicht darauf vertrauen, dass er auch immer akzeptiert wird, da eben der offizielle PathSeparator der "\" ist.
Aber was heißt du wußtest das nicht? Noch nie einen Pfad in der Konsole oder damals noch unter DOS eingegeben? :gruebel: |
Re: Zeilenweise in Datei Schreiben
Doch wusste ich schon, aber ich habe in letzter ZEit viel mit Linux gearbeitet und diese Sache einfach übersehen. PathSeparator hat sich im ersten Moment einfach nur etwas seltsam angehört und deshalb konnte ich damit nicht gleich etwas anfangen. (um die Uhrzeit ist mein Gehirn warscheinlich bei 5% Leistungsfähigkeit oder so angekommen ^^)
Nun gut, aber trotz alledem bleibt der Fehler der selbe. Also nur zum Verständniss. Ist es unter Windows mit Delphi überhaupt möglich, bestimmte Zeilen einer Textdatei zu ändern, ohne dass man die gesammte Datei in den Hauptspeicher laden muss?! Und wenn ja, könnte vielleicht jemand einen kleinen CodeBeispiel posten, wie ich das mache? Weil mit dem Code, den ich jetzt habe, geht es nicht... |
Re: Zeilenweise in Datei Schreiben
Du kannst nicht gleichzeitig aus einer datei lesen und in sie reinschreiben. Geh über eine Temporäredatei.
|
Re: Zeilenweise in Datei Schreiben
Hallo Evian,
hier hast du ein wenig Code, der dir das Prinzip zeigt:
Delphi-Quellcode:
Grüße vom marabu
procedure PrependLines(s: TStrings; fileName: string);
var fs: TFileStream; fn: string; begin SetLength(fn, MAX_PATH); if GetTempFileName('.', 'TMP', 0, @fn[1]) = 0 then raise Exception.Create(SysErrorMessage(GetLastError)) else SetLength(fn, Pred(Pos(#0, fn))); fs := TFileStream.Create(fileName, fmOpenRead, fmShareDenyWrite); with TFileStream.Create(fn, fmCreate) do begin Write(s.GetText^, StrLen(s.GetText)); CopyFrom(fs, fs.Size); Free; end; fs.Free; DeleteFile(fileName); RenameFile(fn, fileName); end; procedure TDemoForm.ButtonClick(Sender: TObject); const fn = 'c:\daten\temp.txt'; begin with Memo.Lines do begin Clear; Add('123'); Add('abc'); end; PrependLines(Memo.Lines, fn); end; |
Re: Zeilenweise in Datei Schreiben
also prinziepel kann ich hiermit schreiben, aber es wird nicht überschrieben, sondern quasi die Zeielen "123" und "abc" in die erste und zweite ZEile der Datei geschrieben und der Rest dann weiter nach unten verschoben. Also nach dem bearbeiten hat die Datei x also 2 Zeilen mehr als vor dem bearbeiten. Ich möchte aber keine neuen informationen vorhängen, sondern direkt die erste und zweite Zeile überschreiben.
|
Re: Zeilenweise in Datei Schreiben
Ersetzen kannst du bestimmte Zeilen so:
Delphi-Quellcode:
saftey code musst du selbst einbauen. Die Ersetzung von nicht existierenden Zeilennummern wird einfach ignoriert.
procedure ReplaceLines(
s: TStrings; // Ersatzzeilen fileName: string; // Name einer existierenden Textdatei iStart: cardinal // Zeilennummer, Beginn der Ersetzung, ab 0 gezählt ); const BUFSIZE = 32 * 1024; var fIn, fOut: TextFile; fn, line: string; iCount, iStop: cardinal; bufIn, bufOut: array of byte; begin SetLength(fn, MAX_PATH); if GetTempFileName('.', 'TMP', 0, @fn[1]) = 0 then raise Exception.Create(SysErrorMessage(GetLastError)) else SetLength(fn, Pred(Pos(#0, fn))); AssignFile(fIn, fileName); Reset(fIn); SetLength(bufIn, BUFSIZE); SetTextBuf(fIn, bufIn[0]); AssignFile(fOut, fn); Rewrite(fOut); SetLength(bufOut, BUFSIZE); SetTextBuf(fOut, bufOut[0]); iCount := 0; iStop := iStart + s.Count; while not Eof(fIn) do begin ReadLn(fIn, line); if (iCount < iStart) or (iCount >= iStop) then WriteLn(fOut, line) else WriteLn(fOut, s[iCount - iStart]); Inc(iCount); end; CloseFile(fIn); CloseFile(fOut); DeleteFile(fileName); RenameFile(fn, fileName); end; procedure TDemoForm.ButtonClick(Sender: TObject); const fn = 'c:\daten\temp.txt'; begin with Memo.Lines do begin Clear; Add('123'); Add('abc'); end; // Zeilen 1 und 2 werden ersetzt, 0 bleibt erhalten ReplaceLines(Memo.Lines, fn, 1); end; Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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