Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateinamen auslesen und sortieren (https://www.delphipraxis.net/212811-dateinamen-auslesen-und-sortieren.html)

Nico B. 11. Apr 2023 07:12

AW: Dateinamen auslesen und sortieren
 
Hallo zusammen,

dann hier mal mein Code.
Ich muss dazu sagen, dass ich an einem Rechner programmiere, der nicht mit dem Internet verbunden ist.
Ich habe mir zwar beim Abschreiben Mühe gegeben, kann aber nicht ausschließen, dass sich ein Tipp-Fehler eingeschlichen hat.

Delphi-Quellcode:
function Sortierfunktion(Liste: TStringList; Index1: integer; Index2: integer): integer;
begin
  Result:=String.Compare(Liste[Index1],Liste[Index2],[coDigitAsNumbers,coIgnoreCase]);
end;

function AnlagenAuslesen: boolean;
var
  Anlage: TSearchRec;
  DateiListe: TStringList;
  i: integer;
begin
  Result:=true;
  DateiListe:=TStringList.Create;
  DateiListe.Sorted:=true;
  try
    if FindFirst(ExtractFilePath(ParamStr(0)),faAnyFile,Anlage)=0
      then
        try
          begin
            //alle Dateien auslesen
            repeat
              if Anlage.Attr AND faDirectory=faDirectory
                then
                  begin
                    //nichts tun
                  end
                else
                  begin
                    DateiListe.Add(Anlage.Name);
                  end;
            until FindNext(Anlage)<>0;
            //Dateien sortieren
            DateiListe.CustomSort(@Sortierfunktion);
            //Dateien in der richtigen Reihenfolge auslesen
            i:=0;
            while not (DateiListe.Count=i) do
              begin
                DateiAuslesen(ExtractFilePath(ParamStr(0))+DateiListe[i]); //weitere Funktion zum Auslesen der Dateien
                i:=i+1;
              end;
          end;
        finally
          DateiListe.Free;
          FindClose(Anlage);
        end;
  except
    Result:=false;
  end;
end;

KodeZwerg 11. Apr 2023 08:42

AW: Dateinamen auslesen und sortieren
 
DateiListe.Sorted:=true; <<--entfernen!

Nico B. 11. Apr 2023 09:38

AW: Dateinamen auslesen und sortieren
 
Vielen herzlichen Dank auch an Uwe (ohne sein Drängen hätte ich mir wahrscheinlich nicht gleich die Mühe gemacht das Programm abzutippen)!
Jetzt klappt es.

Diese Codezeile wurde in einem anderen Thread zu dem Thema als unbedingt notwendig betitelt.
Und in euren Beispielen habe ich einfach übersehen, dass ihr sie weggelassen habt.

VIELEN, VIELEN DANK noch einmal.
Und entschuldigt, dass ihr euch wegen meiner Dusseligkeit so lange Gedanken dazu machen musstet.

himitsu 11. Apr 2023 10:03

AW: Dateinamen auslesen und sortieren
 
Kommt drauf an

soll automatisch sortiert werden, dann ja, das muß,
soll manuell sortiert werden, weil du hier selber CustomSort aufrufst, dann natürlich nicht.

KodeZwerg 11. Apr 2023 11:41

AW: Dateinamen auslesen und sortieren
 
Hmmm die Embarcadoro Hilfe für TStringList.CustomSort ist aber auch etwas unglücklich beschrieben.
Zitat:

Note: You must explicitly call the CustomSort method. Setting the Sorted property only sorts strings using ANSI (Windows) or UTF-8 (Linux) order, as implemented in the Sort method.
Da sollte eigentlich stehen das beides sich gegenseitig bekämpft und CustomSort immer der Verlierer sein wird :wink:

Benmik 11. Apr 2023 12:16

AW: Dateinamen auslesen und sortieren
 
Wäre
Delphi-Quellcode:
if Anlage.Attr AND faDirectory <> faDirectory
nicht einfacher?

Zudem gebe ich noch zu bedenken, dass du mit dem alleinigen Ausschluss von
Delphi-Quellcode:
faDirectory
sämtliche anderen Attribute (
Delphi-Quellcode:
(faReadOnly, faHidden, faSystem, faArchive,faDevice, faNormal, faTemporary, faSparseFile, faReparsePoint, faCompressed,faOffline, faNotContentIndexed, faEncrypted, faSymLink)
) zulässt. Das mag in deinem Anwendungsfall keine Rolle spielen, sehr generisch ist es nicht.

Nico B. 11. Apr 2023 12:33

AW: Dateinamen auslesen und sortieren
 
Danke für den Hinweis.
Ich habe es jetzt mal beim FindFirst schon die Suche auf '*.csv' eingeschränkt.
Damit hat sich das doch schon erledigt, oder?
Sieht es jetzt besser aus?

Delphi-Quellcode:
    if FindFirst(ExtractFilePath(ParamStr(0))+'*.csv',faAnyFile,Anlage)=0
      then
        try
          begin
            //alle Dateien auslesen
            repeat
              if Anlage.Attr AND faDirectory<>faDirectory
                then
                  DateiListe.Add(Anlage.Name);
            until FindNext(Anlage)<>0;
          usw.usf.

KodeZwerg 11. Apr 2023 12:42

AW: Dateinamen auslesen und sortieren
 
Am einfachsten wäre es vermutlich GetFiles aufzurufen um das daraus entstandene Array zu sortieren und mit was auch immer fortzufahren.

KodeZwerg 11. Apr 2023 12:56

AW: Dateinamen auslesen und sortieren
 
So könnte es beispielsweise aussehen:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Classes, System.IOUtils, System.Types;

function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll' name 'StrCmpLogicalW';

function CompareProc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := StrCmpLogicalW(PChar(List[Index1]), PChar(List[Index2]));
end;

var
  SA: TStringDynArray;
  SL: TStringList;
  i: Integer;
begin
  try
    SA := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)));
    SL := TStringList.Create;
    try
      // mit oder ohne vollen Pfad?
      for i := Low(SA) to High(SA) do
        SL.Add(ExtractFileName(SA[i]));
      SL.CustomSort(@CompareProc);
      for i := 0 to Pred(SL.Count) do
        begin
          // mach was mit der Liste
          WriteLn(SL[i]);
        end;
    finally
      SL.Free;
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

shebang 11. Apr 2023 14:28

AW: Dateinamen auslesen und sortieren
 
Dann würde ich mir aber die TStringList sparen und direkt auf dem Array arbeiten:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses System.SysUtils, System.IOUtils, Generics.Collections, Generics.Defaults;

function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll' name 'StrCmpLogicalW';

var
  i: Integer;
  SA: TArray<string>;
begin
  try
    SA := TDirectory.GetFiles(ExtractFilePath(ParamStr(0)));

    TArray.Sort<string>(SA, TComparer<string>.Construct(
    function(const Left, Right : string) : Integer
    begin
      Result := StrCmpLogicalW(PWideChar(Left), PWideChar(Right));
    end));

    for i := 0 to High(SA) do
    begin
      // mach was mit der Liste
      WriteLn(SA[i]);
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr.
Seite 3 von 3     123   

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