Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeilenweise in Datei Schreiben (https://www.delphipraxis.net/56176-zeilenweise-datei-schreiben.html)

Luckie 2. Nov 2005 00:20

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:

Evian 2. Nov 2005 00:28

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...

Luckie 2. Nov 2005 00:39

Re: Zeilenweise in Datei Schreiben
 
Du kannst nicht gleichzeitig aus einer datei lesen und in sie reinschreiben. Geh über eine Temporäredatei.

marabu 2. Nov 2005 06:28

Re: Zeilenweise in Datei Schreiben
 
Hallo Evian,

hier hast du ein wenig Code, der dir das Prinzip zeigt:

Delphi-Quellcode:
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;
Grüße vom marabu

Evian 2. Nov 2005 15:41

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.

marabu 2. Nov 2005 16:31

Re: Zeilenweise in Datei Schreiben
 
Ersetzen kannst du bestimmte Zeilen so:

Delphi-Quellcode:
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;
saftey code musst du selbst einbauen. Die Ersetzung von nicht existierenden Zeilennummern wird einfach ignoriert.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz