Delphi-PRAXiS

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;

EWeiss 30. Jun 2019 14:23

AW: read und write
 
Delphi-Quellcode:
I := 0; // Fehlte
Du hast mich nicht zu ende schreiben lassen hatte es zu früh abgeschickt da von Hand getippt. )

Zitat:

// <- das ist eine Textdatei File Count ist nicht die Zeilen Anzahl
Jo :)
btw.. Dein Grow auch nicht ;)

Zitat:

Reset(f); // Fehlte
Ja nicht auf den Zeilenanfang gesetzt.

werde es nochmal testen Danke.

gruss

Mavarik 30. Jun 2019 14:32

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435672)
btw.. Dein Grow auch nicht ;)

Das ist ja auch nur dafür da, damit Du nicht für jede Zeile ein Setlength aufrufen musst.

EWeiss 30. Jun 2019 14:54

AW: read und write
 
Ich mache eine Kombination von beiden und gut ist.
Ist mir jetzt zu viel Arbeit die Zeilenlänge des Textes von Hand zu ermitteln.

so geht's und gut ist :)

Delphi-Quellcode:
function TPlayList.SaveM3UFile(Filename: String; clear: BOOL = false): Boolean;
var
  F: TextFile;
  Buffer: String;
  i: Integer;
  CheckM3U: BOOL;
  SList: TStringList;
begin
  Result := True;
  CheckM3U := false;
  try
    SList := TStringList.create;
    SList.LoadFromFile(Filename);
    if SList.Strings[0] = '#EXTM3U' then
      CheckM3U := true;
    SList.Free;

    AssignFile(F, Filename);
    if (FileExists(Filename)) and (not Clear) then
    begin
      Append(F);
    end
    else
    if clear then
      Rewrite(F)
    else
    Rewrite(F);

    if not CheckM3U then
      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;
gruss

peterbelow 30. Jun 2019 15:20

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435656)
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

Manche Leute haben halt eine masochistische Ader :). Wenn Du unbedingt bei Textfile bleiben willst mußt Du die Aufgabe in zwei separate Aktionen teilen: erst die Datei zum lesen öffnen, den gewünschten Teil lesen, die Datei wieder schließen und dann zum Schreiben wieder öffnen. Geht nicht anders.

EWeiss 30. Jun 2019 15:30

AW: read und write
 
Zitat:

erst die Datei zum lesen öffnen, den gewünschten Teil lesen, die Datei wieder schließen und dann zum Schreiben wieder öffnen.
Mache ich ja siehe letzter Beitrag.. ;)
Delphi-Quellcode:
    SList := TStringList.create;
     SList.LoadFromFile(Filename); // öffnen
     if SList.Strings[0] = '#EXTM3U' then // Bereich auslesen
       CheckM3U := true;
     SList.Free; // schließen

     AssignFile(F, Filename); // öffnen
oder..
Delphi-Quellcode:
    AssignFile(F, Filename); // öffnen
    Reset(F); // Zeilenanfang
    while not Eof(F) do
    begin
      ReadLn(F, Buffer);
      if Buffer = '#EXTM3U' then // gefunden
      begin
        CheckM3U := true;
        break; // raus hier
      end;
    end;
    CloseFile(F); // schließen
ohne Array !!

gruss

DieDolly 30. Jun 2019 15:37

AW: read und write
 
Hier eine kleine Verbesserung basierend auf deinem Ansatz
Delphi-Quellcode:
 CheckM3U := False;
 if (FileExists(Filename)) then // LoadFromFile geht in die Hose, wenn die Datei nicht existiert
  begin
   SList := TStringList.Create;
   try
    SList.LoadFromFile(Filename);
 
    CheckM3U := SList.Text.StartsWith(#EXTM3U);
   finally
    SList.Free; // schließen
   end;

   AssignFile(F, Filename); // öffnen
   ...
  end;

EWeiss 30. Jun 2019 15:38

AW: read und write
 
Danke.. habe meinen Beitrag nochmals editiert.
Denke so geht s ;)
Auch ohne TStringList.

Zitat:

Manche Leute haben halt eine masochistische Ader
Du hast so recht.. schwer warm heute, von daher verzeih mir noch mal meine Herangehensweise. ;)

gruss

Mavarik 30. Jun 2019 16:46

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435677)
Mache ich ja siehe letzter Beitrag.. ;)
Delphi-Quellcode:
    SList := TStringList.create;
     SList.LoadFromFile(Filename); // öffnen
     if SList.Strings[0] = '#EXTM3U' then // Bereich auslesen
       CheckM3U := true;
     SList.Free; // schließen

     AssignFile(F, Filename); // öffnen
ohne Array !!

Echt jetzt? Den ganzen File in Memory laden um festzustellen, ob in der 1. Zeile ein Token steht...
Und wenn es eh schon im Speicher ist, dann nicht die List ergänzen und SavetoFile…

omg... Ich gebe auf.

EWeiss 30. Jun 2019 16:54

AW: read und write
 
Zitat:

Zitat von Mavarik (Beitrag 1435682)
Zitat:

Zitat von EWeiss (Beitrag 1435677)
Mache ich ja siehe letzter Beitrag.. ;)
Delphi-Quellcode:
    SList := TStringList.create;
     SList.LoadFromFile(Filename); // öffnen
     if SList.Strings[0] = '#EXTM3U' then // Bereich auslesen
       CheckM3U := true;
     SList.Free; // schließen

     AssignFile(F, Filename); // öffnen
ohne Array !!

Echt jetzt? Den ganzen File in Memory laden um festzustellen, ob in der 1. Zeile ein Token steht...
Und wenn es eh schon im Speicher ist, dann nicht die List ergänzen und SavetoFile…

omg... Ich gebe auf.

Echt jetzt?
Liest du eigentlich auch was anderes als nur das was dir so gefällt?
Nochmal extra für dich!

Delphi-Quellcode:
    AssignFile(F, Filename); // öffnen
     Reset(F); // Zeilenanfang
     while not Eof(F) do
     begin
       ReadLn(F, Buffer);
       if Buffer = '#EXTM3U' then // gefunden
       begin
         CheckM3U := true;
         break; // raus hier
       end;
     end;
     CloseFile(F); // schließen
Den Post hättest du dir gerne sparen können denn er war unnötig.
Möchtest du mich diffamieren oder was bezweckst du damit!
Ohne dein ominöses Array.. Sorry das musste jetzt sein.

Manchmal fällt einem nichts ein deshalb aber versuchen hier jemand zur Schau zu stellen ist auch nicht die feine Art.

Zitat:

Zitat von Mavarik (Beitrag 1435669)
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

Nur eines der Beispiele. .Das du mich für so blöd hältst das ich mein Array so auslegen würde spricht schon für sich.
OK! Ist gut Thema erledigt.. Trotzdem Danke.

gruss

DieDolly 30. Jun 2019 17:03

AW: read und write
 
Zitat:

Zitat von Mavarik (Beitrag 1435682)
Echt jetzt? Den ganzen File in Memory laden um festzustellen, ob in der 1. Zeile ein Token steht...

Vielleicht so?
Delphi-Quellcode:
function IsM3UFile(const AFileName: string): BOOLEAN;
 var
  FileStream: TFileStream;
  LineBuffer: TBytes;
  Encoding: TEncoding;
  Line: string;
 begin
  Result := False;

  FileStream := TFileStream.Create(AFileName, fmOpenRead);
  try
   SetLength(LineBuffer, 7);
   FileStream.Read(LineBuffer[0], Length(LineBuffer));
   TEncoding.GetBufferEncoding(LineBuffer, Encoding);

   Result := Encoding.GetString(LineBuffer).StartsWith('#EXTM3U');
  finally
   FileStream.Free;
  end;
 end;


 B := IsM3UFile();
Kann man eventuell noch umschreiben, sodass #EXTM3U reingeschrieben wird, wenn es nicht existiert.

EWeiss 30. Jun 2019 17:06

AW: read und write
 
Zitat:

Vielleicht so?
Das Thema ist doch erledigt ;)
Ich sehe jetzt keinen Anlass hier noch was zu ändern.
Es tut was es soll.

Delphi-Quellcode:
    AssignFile(F, Filename); // öffnen
      Reset(F); // Zeilenanfang
      while not Eof(F) do
      begin
        ReadLn(F, Buffer);
        if Buffer = '#EXTM3U' then // gefunden
        begin
          CheckM3U := true;
          break; // raus hier
        end;
      end;
      CloseFile(F); // schließen
gruss

p80286 30. Jun 2019 22:01

AW: read und write
 
Entschuldige wenn ich darauf herum reite. Wenn '#EXTM3U' in der ersten Zeile steht, dann reicht es auch, die erste Zeile zu lesen.
Sollte der Text in der 1. oder 2. oder 3. oder... Zeile stehen, dann

Delphi-Quellcode:
var
  buffer : array [0..$FFFF] of byte; // macht es etwas schneller
  enthaltext3m3u : boolean;

enhaltext3mu:=false;
assignfile(f,Myfile);
reset(f,buffer);
while not(eof(f)) and (mystring<>'#EXTM3U') do
begin
  readln(f,mystring);
  enthaltext3mu;)mystring='#EXTM3U';
end;
closefile(f);
assignfile(f,myfile);
if enthaltext3mu and not(clear) then
  reset(f,buffer)
else
  rewrite(f,buffer);
(ohne gewähr!)

Ich hoffe ich hab an alles gedacht.

Gruß
K-H

Mavarik 1. Jul 2019 10:36

AW: read und write
 
Zitat:

Zitat von EWeiss (Beitrag 1435683)
Möchtest du mich diffamieren oder was bezweckst du damit!

Nein, natürlich nicht - wenn Du es so aufgefasst hast, entschuldige ich mich hierfür...

EWeiss 1. Jul 2019 10:42

AW: read und write
 
Zitat:

Zitat von Mavarik (Beitrag 1435720)
Zitat:

Zitat von EWeiss (Beitrag 1435683)
Möchtest du mich diffamieren oder was bezweckst du damit!

Nein, natürlich nicht - wenn Du es so aufgefasst hast, entschuldige ich mich hierfür...

Danke! Und vergessen..

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

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