Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   read und write (https://www.delphipraxis.net/201187-read-und-write.html)

EWeiss 30. Jun 2019 12:06

read und write
 
Ich Speicher eine Datei..
Delphi-Quellcode:
{$REGION 'function SaveM3UFile'}
function TPlayList.SaveM3UFile(Filename: String; clear: BOOL = false): Boolean;
var
  F: TextFile;
  Buffer: String;
  i: Integer;
begin
  Result := True;
  try
    AssignFile(F, Filename);
    if (FileExists(Filename)) and (not Clear) then
    begin
      Append(F);
    end
    else
    if clear then
      Rewrite(F)
    else
    Rewrite(F);

    Writeln(F, '#EXTM3U');
    for i := 0 to FFile.Count - 1 do
    begin
      Buffer := Format('#EXTINF:%s|%s|%s|%s', [FTime.Strings[i], FTitle.Strings[i],
        FArtist.Strings[i], FAlbum.Strings[i]]);
      Writeln(F, Buffer);
      Writeln(F, FFile.Strings[i]);
    end;
    CloseFile(F);
  except
    CloseFile(F);
    Result := False;
  end;

end;
{$ENDREGION}
Jetzt will ich prüfen ob der Eintrag existiert "EXTM3U" wenn vorhanden soll er nicht nochmals addiert werden.
Er soll einmalig in die erste Zeile addiert wird.
Dachte ich mir ist kein Problem.

Delphi-Quellcode:
    ReadLn(F, Buffer);
    if Buffer = '#EXTM3U' then
      Continue;
Nur wenn ich schreibe kann ich nicht gleichzeitig lesen.
Wo liegt mein Denkfehler'?

gruss

peterbelow 30. Jun 2019 12:35

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435652)
Ich Speicher eine Datei..
Delphi-Quellcode:
{$REGION 'function SaveM3UFile'}
function TPlayList.SaveM3UFile(Filename: String; clear: BOOL = false): Boolean;
var
  F: TextFile;
  Buffer: String;
  i: Integer;
begin
  Result := True;
  try
    AssignFile(F, Filename);
    if (FileExists(Filename)) and (not Clear) then
    begin
      Append(F);
    end
    else
    if clear then
      Rewrite(F)
    else
    Rewrite(F);

    Writeln(F, '#EXTM3U');
    for i := 0 to FFile.Count - 1 do
    begin
      Buffer := Format('#EXTINF:%s|%s|%s|%s', [FTime.Strings[i], FTitle.Strings[i],
        FArtist.Strings[i], FAlbum.Strings[i]]);
      Writeln(F, Buffer);
      Writeln(F, FFile.Strings[i]);
    end;
    CloseFile(F);
  except
    CloseFile(F);
    Result := False;
  end;

end;
{$ENDREGION}
Jetzt will ich prüfen ob der Eintrag existiert "EXTM3U" wenn vorhanden soll er nicht nochmals addiert werden.
Er soll einmalig in die erste Zeile addiert wird.
Dachte ich mir ist kein Problem.

Delphi-Quellcode:
    ReadLn(F, Buffer);
    if Buffer = '#EXTM3U' then
      Continue;
Nur wenn ich schreibe kann ich nicht gleichzeitig lesen.
Wo liegt mein Denkfehler'?

gruss

Dein Fehler ist, dieses uralte Textfile API zu verwenden, das hat halt seine Limitierungen. Z. B. kann man nicht gleichzeitig eine Textdatei lesen und in die gleiche Datei schreiben, weil der IO intern gepuffert wird.

Vergiss das alles, verwende eine TStringlist. Mit stringlist.LoadFromfile kannst Du eine Textdatei laden, die dabei gleich zeilenweise zerlegt wird. Danach kannst du die stringlist nach belieben manipulieren und schließlich per stringlist.Savetofile wieder in eine Datei schreiben. Eine existierende Datei wird dabei überschrieben.

EWeiss 30. Jun 2019 12:43

AW: read und write
 
Zitat:

Dein Fehler ist, dieses uralte Textfile API zu verwenden
Es hat seine gründe ;)

Ich schreibe mit Win32Api mitteln und verwende nicht überall TStringList nur weil es bequemer ist.
Meine Anwendungen basieren auf NONVCL.. ja ich weis auch dort kann man TStringList verwenden.

Ich suche eine Lösung für Meine Anwendungsweise.
Es muss doch möglich sein während des Schreibens vorher\gleichzeitig zu prüfen ob der Eintrag in der Datei existiert.

Danke..

gruss

Mavarik 30. Jun 2019 13:16

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435656)
Ich suche eine Lösung für Meine Anwendungsweise.

Pseudo Code:
Delphi-Quellcode:
I := 0;
if FileExists
  While not eof do
    Readln(F,Array[i])
    inc(I)

Work...

if not(Array[0] = 'Whatever')
  Writeln('Whatever')

For i:=0 to high(Array) do
  Writeln(f,Array[i])
;-)

EWeiss 30. Jun 2019 13:23

AW: read und write
 
Werde es mal testen danke für die Informationen..
Leider nicht.

PS:
E\A error..

gruss

Mavarik 30. Jun 2019 13:38

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435661)
Werde es mal testen danke für die Informationen..
Leider nicht.

PS:
E\A error..

gruss

LOL... Nach dem Lesen, musst Du die Datei natürlich wieder zu machen und mit rewrite neu schreiben...

EWeiss 30. Jun 2019 13:44

AW: read und write
 
Zitat:

Zitat von Mavarik (Beitrag 1435663)
Zitat:

Zitat von EWeiss (Beitrag 1435661)
Werde es mal testen danke für die Informationen..
Leider nicht.

PS:
E\A error..

gruss

LOL... Nach dem Lesen, musst Du die Datei natürlich wieder zu machen und mit rewrite neu schreiben...

Schon klar
Delphi-Quellcode:
Readln(F,Array[i])
Hier kracht es schon.. direkt nach dem öffnen.
Hatte hier natürlich ein entsprechendes Array vorher erstellt nicht deine Definition.
Falls du das denkst.

also fakt ich komme gar nicht erst zum lesen ich öffne die Datei und es kracht.
Kein Problem werde mir eine Lösung erarbeiten. Trotzdem Danke nochmals.

gruss

Mavarik 30. Jun 2019 14:07

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435664)
Delphi-Quellcode:
Readln(F,Array[i])
Hier kracht es schon.. direkt nach dem öffnen.

Ich hoff Du hast es so nicht geschrieben...

sondern

Delphi-Quellcode:
Var
  S : TArray<String>;
Zeig mal den Code PLS

EWeiss 30. Jun 2019 14:11

AW: read und write
 
Zitat:

Ich hoff Du hast es so nicht geschrieben...
Meine Antwort dazu.. dachte mir schon das so eine Frage auftaucht.
Zitat:

Hatte hier natürlich ein entsprechendes Array vorher erstellt nicht deine Definition.
Falls du das denkst.
so aus dem Steg heraus..

File öffnen..
Delphi-Quellcode:
var
  CheckM3U: array of string;
  i: Integer;
begin
  I := 0;
  AssignFile(F, Filename);
  SetLength(CheckM3U, FFile.Count);

  While not eof do
    Readln(F, CheckM3U[i]); // crash..
    inc(I);
end;
gruss

Mavarik 30. Jun 2019 14:18

AW: read und write
 
File öffnen..
Delphi-Quellcode:
var
  CheckM3U: array of string;
  i: Integer;
begin
  AssignFile(F, Filename);
  SetLength(CheckM3U, FFile.Count); // <- das ist eine Textdatei File Count ist nicht die Zeilen Anzahl

  Reset(f); // Fehlte

  I := 0; // Fehlte
  While not eof do
    Readln(F, CheckM3U[i]); // crash.. logisch
    inc(I);
end;
Also eher:

Delphi-Quellcode:
var
  f : Textfile;
  CheckM3U: array of string;
  i,Grow: Integer;
begin
  Grow := 100;
  AssignFile(F, Filename);
  SetLength(CheckM3U,Grow);

  Reset(f); // Fehlte

  I := 0; // Fehlte
  While not eof do
    begin
    if I > high(CheckM3U) then
      setlength(CheckM3U,Length(CheckM3U)+Grow);
 
    Readln(F, CheckM3U[i]); // crash.. logisch
    inc(I);
    end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.
Seite 1 von 3  1 23      

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