Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Dateiliste sortieren (https://www.delphipraxis.net/152622-dateiliste-sortieren.html)

kurtm1 29. Jun 2010 19:59

Dateiliste sortieren
 
Ich habe in einer Stringliste links zu Dateipfaden.

C:\Temp1\abc10.txt
C:\Temp1\abc1.txt
C:\Temp1\abc5.txt
C:\Temp10\7.txt
C:\Temp10\10.txt
C:\Temp10\1.txt

Rauskommen soll eine nach Ordnern und Dateien sortierte Liste:

C:\Temp1\abc1.txt
C:\Temp1\abc5.txt
C:\Temp1\abc10.txt
C:\Temp10\1.txt
C:\Temp10\7.txt
C:\Temp10\10.txt

Mit der Standard Sort Methode der Stringlist funktioniert das nicht..

daywalker9 29. Jun 2010 20:03

AW: Dateiliste sortieren
 
Du kannst auch einfach eine eigene Sortiermethode schreiben und diese der TStringList bekannt machen:

Delphi-Quellcode:
    procedure TStringList.CustomSort(Compare: TStringListSortCompare); virtual;

Delphi-Quellcode:

  function TForm1.DoSort(List: TStringList; Index1, Index2: Integer): Integer;
  var s1, s2 : String;
  begin s1:=List[Index1];
        s2:=List[index2];
        if s1>s2 then
         result:=1
        else
          if s2>s1 then
            result:=-1
        else
          result:=0;
         
  end;

kurtm1 29. Jun 2010 20:20

AW: Dateiliste sortieren
 
Das weiß ich allerdings weiß ich nicht wie ich das CustomSort für diesen Zweck korrekt umsetze

daywalker9 29. Jun 2010 20:27

AW: Dateiliste sortieren
 
Du bekommst ja die beiden Indices der String, die vergliechen werden. Dann vergleichst du die nach deinen Kriterien. Du könntest nun z.b. die beiden Strings Stück für Stück vergleichen. Probier das CustomSort doch mal aus und denk nach, wie du die vergleichen willst

kurtm1 29. Jun 2010 20:45

AW: Dateiliste sortieren
 
Die Standarsortierung bekomme ich auch hin (so wie Tstringlist.Sort):

Delphi-Quellcode:
  function DoSort(List: TStringList; Index1, Index2: Integer): Integer;
  var s1, s2 : String;
  begin
        s1:=List[Index1];
        s2:=List[index2];

        //wenn s1 ordner == s2 ordner
        if ExtractFilePath(s1)=ExtractFilePath(s2) then
          Result:=AnsiCompareStr(ExtractFileName(s1),ExtractFileName(s2))
        else
          Result:=AnsiCompareStr(ExtractFilePath(s1),ExtractFilePath(s2))
  end;
Probleme gibt es allerdings wenn ich Dateien nach diesem Muster habe:
aaa01
aaa09
aaa010

=> in diesem Fall wird nämlich folgendes ausgegeben:
aaa01
aaa010
aaa09

Sir Rufo 29. Jun 2010 20:51

AW: Dateiliste sortieren
 
Wundern tut das ja nicht, so arbeitet auch die interne Sortierung der StringList ;)

Da hilft wohl nur parsen oder einen Mac kaufen (die sortieren so wie du das willst) ;)

Hole dir aus den Dateinamen den String/Zahlenteil und den Rest
Code:
'aaa010\test1' => 'aaa',10,'\test1'
'aaa01\test2' => 'aaa',1,'\test2'
Jetzt vergleichen wir den String und Zahlenteil. Sind diese gleich, dann arbeiten wir nur mit dem Reststring weiter.
Also brauchen wir folgende Funktion:
Delphi-Quellcode:
procedure( const AStr : string; out OStr : string; out OInt : integer; out RStr : string );

kurtm1 29. Jun 2010 21:33

AW: Dateiliste sortieren
 
ok, der code von hier macht es korrekt:

http://objectmix.com/delphi/402461-n...-tstrings.html

Sir Rufo 29. Jun 2010 23:00

AW: Dateiliste sortieren
 
Zitat:

Zitat von kurtm1 (Beitrag 1032465)
ok, der code von hier macht es korrekt:

http://objectmix.com/delphi/402461-n...-tstrings.html

Dann arbeitet dein Delphi anders als meins. Der Code von da liefert mir folgende Sortierung:
Code:
C:\Temp1\abc1.txt
C:\Temp1\abc10.txt
C:\Temp1\abc5.txt
C:\Temp10\1.txt
C:\Temp10\10.txt
C:\Temp10\7.txt
Aber so wolltest du das nicht (oder am Anfang wenigstens nicht)


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