read und write
Ich Speicher eine Datei..
Delphi-Quellcode:
Jetzt will ich prüfen ob der Eintrag existiert "EXTM3U" wenn vorhanden soll er nicht nochmals addiert werden.
{$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} Er soll einmalig in die erste Zeile addiert wird. Dachte ich mir ist kein Problem.
Delphi-Quellcode:
Nur wenn ich schreibe kann ich nicht gleichzeitig lesen.
ReadLn(F, Buffer);
if Buffer = '#EXTM3U' then Continue; Wo liegt mein Denkfehler'? gruss |
AW: read und write
Zitat:
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. |
AW: read und write
Zitat:
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 |
AW: read und write
Zitat:
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]) |
AW: read und write
Werde es mal testen danke für die Informationen..
Leider nicht. PS: E\A error.. gruss |
AW: read und write
Zitat:
|
AW: read und write
Zitat:
Delphi-Quellcode:
Hier kracht es schon.. direkt nach dem öffnen.
Readln(F,Array[i])
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 |
AW: read und write
Zitat:
sondern
Delphi-Quellcode:
Zeig mal den Code PLS
Var
S : TArray<String>; |
AW: read und write
Zitat:
Zitat:
File öffnen..
Delphi-Quellcode:
gruss
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; |
AW: read und write
File öffnen..
Delphi-Quellcode:
Also eher:
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;
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; |
AW: read und write
Delphi-Quellcode:
Du hast mich nicht zu ende schreiben lassen hatte es zu früh abgeschickt da von Hand getippt. )
I := 0; // Fehlte
Zitat:
btw.. Dein Grow auch nicht ;) Zitat:
werde es nochmal testen Danke. gruss |
AW: read und write
Zitat:
|
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:
gruss
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; |
AW: read und write
Zitat:
|
AW: read und write
Zitat:
Delphi-Quellcode:
oder..
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
Delphi-Quellcode:
ohne Array !!
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 |
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; |
AW: read und write
Danke.. habe meinen Beitrag nochmals editiert.
Denke so geht s ;) Auch ohne TStringList. Zitat:
gruss |
AW: read und write
Zitat:
Und wenn es eh schon im Speicher ist, dann nicht die List ergänzen und SavetoFile… omg... Ich gebe auf. |
AW: read und write
Zitat:
Liest du eigentlich auch was anderes als nur das was dir so gefällt? Nochmal extra für dich!
Delphi-Quellcode:
Den Post hättest du dir gerne sparen können denn er war unnötig.
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 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:
OK! Ist gut Thema erledigt.. Trotzdem Danke. gruss |
AW: read und write
Zitat:
Delphi-Quellcode:
Kann man eventuell noch umschreiben, sodass #EXTM3U reingeschrieben wird, wenn es nicht existiert.
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(); |
AW: read und write
Zitat:
Ich sehe jetzt keinen Anlass hier noch was zu ändern. Es tut was es soll.
Delphi-Quellcode:
gruss
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 |
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:
(ohne gewähr!)
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); Ich hoffe ich hab an alles gedacht. Gruß K-H |
AW: read und write
Zitat:
|
AW: read und write
Zitat:
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