Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi fehler mit Pos() ? (https://www.delphipraxis.net/12359-fehler-mit-pos.html)

sharkx 26. Nov 2003 00:44


fehler mit Pos() ?
 
Hallo,

Ich lese eine Text Datei mit LoadFromFile in eine StringListe. Diese lasse ich dann durch eine Schleife laufen und füge alle zeilen die nicht mit ; oder ' ' (leerzeichen) beginnen in eine neue StringList.

Die Procedure:
Delphi-Quellcode:
function CreateStringList(SFVFile: string): string;
var
  OldList: TStrings;
  NewList: TStrings;
  i: integer;
begin
  NewList := TStringList.Create;
  OldList := TStringList.Create;

  OldList.LoadFromFile(SFVFile);

  for i := 0 to OldList.Count - 1 do
    begin
      if (Pos(';', OldList.Strings[i]) = 1) or (Pos(' ', OldList.Strings[i]) = 1) then
        Continue
      else
        NewList.Add(OldList.Strings[i]);
    end;
   
  OldList.Free;
  Result := NewList.CommaText;
end;

die SFV File, von der gelsen wird sieht etwa so aus:
Delphi-Quellcode:
; sfv raped by project-zs (mXr edition)

;

datei a bissel text
das ganze nochmal
und nochmal
Jedesmal wenn ich eine sfv file lade, die diese ; sfv rapped ... Commends hat, stimmem die Strings in der StringListe nicht mehr.
Wo steckt mein fehler?

Danke :-)

Wormid 26. Nov 2003 01:15

Re: fehler mit Pos() ?
 
Moinsen,

versuche das ganze mal so:

Delphi-Quellcode:
var SFVFile: TStringList;
    i: Integer;
begin
  SFVFile := TStringList.Create;
  SFVFile.LoadFromFile(SFVFileName);

  for i := SFVFile.Count - 1 downto 0 do
  begin
    SFVFile[i] := Trim(SFVFile[i]);
    if (Length(SFVFile[i]) = 0) or (SFVFile[i][1] = ';') then
      SFVFile.Delete(i);
  end;

  Result := SFVFile.CommaText;
  SFVFile.Free;
end;
Gruß

Wormid

Luckie 26. Nov 2003 02:13

Re: fehler mit Pos() ?
 
Zu aller erst würde ich die if-bedingung ändern:
Delphi-Quellcode:
if not ((Pos(';', OldList.Strings[i]) = 1) or (Pos(' ', OldList.Strings[i]) = 1)) then
  NewList.Add(...);
Damit sparst du dir dieses Rumgehopse in der Schleife mit dem Continue.

sharkx 26. Nov 2003 09:39

Re: fehler mit Pos() ?
 
@WormId: Das funktioniert nicht, da diese function in einer Schleife läuft die bis SFVFile.Count läuft. Wenn ich dann Strings abschneiden würde, stimmt der Count nicht mehr und ich bekomm eine Exception.

@Luckie: Stimmt, hast Recht, aber das Problem is damit nicht behoben.



Mit dem Inhalt der StringList erstelle ich jeweils für einen Eintrag eine neue Datei.

Delphi-Quellcode:
procedure CreateMissing(FileList: TStrings; Directory: String);
var
  i: integer;
begin
  for i := 0 to FileList.Count - 1 do
    begin
      dump := Copy(FileList.Strings[i], 1,Pos(' ', FileList.Strings[i]) - 1);
      FileClose(FileCreate(directory + dump + '-missing'));
    end;
end;
Wenn jedoch ; Kommentare in der alten StringList war, dann erstellt er mir 1 -missing file die nicht sein dürfte. Der Rest stimmt alles.

sharkx 26. Nov 2003 09:49

Re: fehler mit Pos() ?
 
Arg Stop!, Ich hab das Problem gefunden ..

sharkx 26. Nov 2003 13:01

Re: fehler mit Pos() ?
 
Problem doch nicht behoben...

Wenn jmd den fehler sieht, pls help :-)

Wormid 26. Nov 2003 13:19

Re: fehler mit Pos() ?
 
Zitat:

@WormId: Das funktioniert nicht, da diese function in einer Schleife läuft die bis SFVFile.Count läuft. Wenn ich dann Strings abschneiden würde, stimmt der Count nicht mehr und ich bekomm eine Exception.
Ich verstehe nicht so ganz, warum "meine" Variante nicht funktionieren soll...

Was läuft in einer Schleife ab, und auf welches Count beziehst Du dich jetzt? Eines in deinem Code irgendwo, oder in meinem Beispiel jetzt?

sharkx 26. Nov 2003 13:25

Re: fehler mit Pos() ?
 
Delphi-Quellcode:
CheckList := TStringList.Create;
  CheckList.CommaText := CreateStringList(ParamStr(1));

  dir := ExtractFilePath(ParamStr(1));

  // Create Missing Files
  CreateMissing(CheckList, dir);

  // Create Incomplete File
  CreateIncompleteFile(dir);

  for i := 0 to CheckList.Count - 1 do
    begin
    filen := Copy(CheckList.Strings[i], 1,Pos(' ', CheckList.Strings[i]) - 1);

    if FileExists(dir + filen) then
......
die Function CreateMissing steht weiter oben in diesem Tread.

die function CreateStringList sieht nun wie filgt aus:
Delphi-Quellcode:
function CreateStringList(SFVFile: string): string;
var
  OldList: TStrings;
  NewList: TStrings;
  i: integer;
begin
  NewList := TStringList.Create;
  OldList := TStringList.Create;

  OldList.LoadFromFile(SFVFile);

  for i := 0 to OldList.Count - 1 do
    if (Length(Trim(OldList.Strings[i])) > 0) and (OldList.Strings[i][1] <> ';') then
      NewList.Add(OldList.Strings[i]);

  OldList.Free;
  Result := NewList.CommaText;
end;
Trotzdem habe ich ab und an noch eine -missing datei die garnicht da sein dürfte. Somit stimmem auch alle weiteren Proceduren die auf den beiden functionen aufbauen überhaupt nicht mehr.

Wormid 26. Nov 2003 13:38

Re: fehler mit Pos() ?
 
Hast du mal ein SFVFile da? Denn mit meinem Testfile funktionuckelt das...

sharkx 26. Nov 2003 15:51

Re: fehler mit Pos() ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
sicher doch ...

Wormid 26. Nov 2003 16:08

Re: fehler mit Pos() ?
 
Hmmm... So richtig schnall ich das Problem scheinbar nicht - was soll denn da eigentlich passieren?

Der Code liest jetzt so ein sfv-File ein, entfernt Leerzeilen und Kommentare und legt dann für jeden Dateieintrag eine leere Datei an. Mit deinem Code hier scheint das doch zu funktionieren, den Sinn verstehe ich zwar nicht, aber es tut... :shock:

Falls Du einfach nur ein simples SFV-Tool suchst, das dir bequem anzeigt, welche Dateien fehlen oder korrupt sind, dann empfehle ich dir mal einen Blick auf FlashSFV zu werfen -> http://www.flashfxp.com/freeware.php?Program=FlashSFV


Gruß

Wormid

Touchdown 26. Nov 2003 16:12

Re: fehler mit Pos() ?
 
Wäre es nicht sinnvoller als Result eine Stringlist zurück zu geben? Der String könnte doch ziemlich lang werden ...

sharkx 26. Nov 2003 16:14

Re: fehler mit Pos() ?
 
Es funktioniert eigentlich .. aber aus mir unerklärlichen Gründen legt er mir Oftmals eine '-missing' Datei ohne dateinamen an.
Und dieses problem würde ich gern beheben :>

Du verstehst den Sinn nicht? Sagen dir zipscripte etwas? glFTPd und zipscript -c z.b.? Wenn ja siehst du oben ein stück code von so einem :-)

Ansonsten kannst du mal www.glftpd.at besuchen, dort gibt es jede menge solcher zipscripte für FTPDs. jedoch verwende ich hier keinen FTPD als ausgang, sondern lediglich einen WinNT Service.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 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