![]() |
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; |
AW: Dateinamen auslesen und sortieren
DateiListe.Sorted:=true; <<--entfernen!
|
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. |
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. |
AW: Dateinamen auslesen und sortieren
Hmmm die Embarcadoro Hilfe für
![]() Zitat:
|
AW: Dateinamen auslesen und sortieren
Wäre
Delphi-Quellcode:
nicht einfacher?
if Anlage.Attr AND faDirectory <> faDirectory
Zudem gebe ich noch zu bedenken, dass du mit dem alleinigen Ausschluss von
Delphi-Quellcode:
sämtliche anderen Attribute (
faDirectory
Delphi-Quellcode:
) zulässt. Das mag in deinem Anwendungsfall keine Rolle spielen, sehr generisch ist es nicht.
(faReadOnly, faHidden, faSystem, faArchive,faDevice, faNormal, faTemporary, faSparseFile, faReparsePoint, faCompressed,faOffline, faNotContentIndexed, faEncrypted, faSymLink)
|
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. |
AW: Dateinamen auslesen und sortieren
Am einfachsten wäre es vermutlich
![]() |
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. |
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 21:42 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