AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Files suchen und sortieren

Ein Thema von stahli · begonnen am 11. Jul 2011 · letzter Beitrag vom 12. Jul 2011
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

Files suchen und sortieren

  Alt 11. Jul 2011, 22:30
Ich ermittle einige PDF-Dateien und sortiere die nach dem Erstellungsdatum.
Das funktioniert, ich bin aber nicht sicher, ob ich die einfachste Lösung habe.
Würde es jemand anders machen?

Muss nicht mit Generics sein. Würde eine anonyme Methode etwas vereinfachen?

Delphi-Quellcode:
type

  TsrComparer = class(TComparer<TSearchRec>)
    function Compare(const sr1, sr2: TSearchRec): Integer; override;
  end;

implementation

{ TMeleePairComparer }

function TsrComparer.Compare(const sr1, sr2: TSearchRec): Integer;
begin
  Result := 0;
  if Result = 0 then
    Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp);
  if Result = 0 then
    Result := CompareStr(sr1.Name, sr2.Name);
end;

...

procedure TFormOlympic.TabSheetReportShow(Sender: TObject);

  procedure GetFiles;
  var
    sr: TSearchRec;
    srList: TList<TSearchRec>;
    F: Boolean; // ergänzt
  begin
    srList := TList<TSearchRec>.Create(TsrComparer.Create);
    if PathReport <> 'then
    begin
      F := FindFirst(PathReport + '*.pdf', (faAnyFile and not faDirectory), sr);
      while F = 0 do
      begin
        if ExtractFileExt(sr.Name) = '.pdfthen
          srList.Add(sr);
        F := FindNext(sr);
      end;
      FindClose(sr);
    end;
    srList.Sort;
    ListBoxReport.Clear;
    for sr in srList do
      ListBoxReport.Items.Add(sr.Name);
    FreeAndNil(srList);
  end;

begin
  GetFiles;
  ListBoxReport.ItemIndex := 0;
  ListBoxReportClick(Sender);
end;

PS: Auf ein TsShellListView (AlphaControls) hatte ich verzichtet, da ein umsortieren dort nicht möglich war.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (12. Jul 2011 um 17:38 Uhr)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Files suchen und sortieren

  Alt 11. Jul 2011, 22:37
Könnte man auch so machen:

Delphi-Quellcode:

    lst:=TList<TSearchRec>.create;
    lst.Sort(TComparer<TSearchRec>.Construct(function (const sr1,sr2 : TSearchRec):integer
                                               begin
                                                Result := 0;
                                                if Result = 0 then
                                                  Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp);
                                                if Result = 0 then
                                                  Result := CompareStr(sr1.Name, sr2.Name);
                                               end));
Lars
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#3

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 03:17
Resourcenscchutz?

FreeAndNil ist, bei Variablen, welche eh nicht geprüft werden und nur lokal genutzt werden, etwas übertrieben.

Wieso ist das lokale F global deklariert, bzw. wo wurde es eigentlich deklariert?

Und jupp, an die anonymen Methoden gewöhne ich mich auch so langsam, aber ob es hier wirklich sinnvoll/nötig ist, ist eine andere Frage
(aber oftmals machen sie den Code schon lesbarer, da der Code dann zwar nicht wiederverwendbar ist, aber wenigenstens, bei linearen Funktionen, im Kontext des aufrufenden Codes bleibt und man nicht erst suchen/umblättern muß ... z.B. bei Synchronize-Aufrufen ist das eine geile Angelegenheite und auch kleinere Thread-Prozeduren erstelle ich heutzutage anonym )

Da man FindClose eh nur aufrufen muß, wenn FindFirst erfolgreich war, ist die Repeat-Schleife (aus dem OH-Beispiel) keine schlechte Idee.

Zitat:
ExtractFileExt(sr.Name) = '.pdf'
irgendwas.PDF oder x.PdF willst du nicht finden?

Delphi-Quellcode:
procedure GetFiles;
var
  sr: TSearchRec;
  srList: TList<TSearchRec>;
begin
  srList := TList<TSearchRec>.Create(function(const sr1, sr2: TSearchRec): Integer
    begin
      Result := 0;
      if Result = 0 then
        Result := -CompareValue(sr1.TimeStamp, sr2.TimeStamp);
      if Result = 0 then
        Result := CompareStr(sr1.Name, sr2.Name);
    end));
  try
    if (PathReport <> '') and (FindFirst(PathReport + '*.pdf', (faAnyFile and not faDirectory), sr) = 0) then
    begin
      repeat
        //if SameText(ExtractFileExt(sr.Name), '.pdf') then
        if EndsText('.pdf', sr.Name) then //Unit StrUtils
          srList.Add(sr);
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
    srList.Sort;
    ListBoxReport.Clear;
    for sr in srList do
      ListBoxReport.Items.Add(sr.Name);
  finally
    srList.Free;
  end;
end;
PS: Leider hat man in TDirectory.GetFiles (Unit IOUtils) die Sortierung vergessen, aber sonst könnte man diese neue Unit sich schonmal ansehn, auch wenn ich persönlich diese Unit für total Mißlungen halte.
Aber zumindestens die Methoden, um über nur einen Befehl auf bestimmte Dateieigenschaften zuzugreifen, ist manchmal recht praktisch.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Jul 2011 um 03:54 Uhr)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 08:58
Ich würde da noch Refacoring ansetzen:

Delphi-Quellcode:
Function FileList (aPath : String) : TSearchRecList;
Begin
  Result := TSearchRecList.Create;
  Try
    ReadDirectory (aPath, Result);
    SortListByCreationData(Result);
  Except
    Result.Free;
    Result := Nil;
    Raise;
  End;
End;
Übersichtlich, einfach zu lesen.

So praktisch Generics auch sind, so 'häßlich' finde ich sie. Ich kapsele lieber bzw. lasse sie nur in den untersten Ebenen ihr wahres Gesicht zeigen. Denn vielleicht ist eine 'TList<TSearchRec>' ja irgendwann nicht mehr das Gelbe vom Ei.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 17:51
Resourcenscchutz?
Setze ich nur ein, wenn es wirklich Sinn macht.

FreeAndNil ist, bei Variablen, welche eh nicht geprüft werden und nur lokal genutzt werden, etwas übertrieben.
Ist Gewohnheitssache. Free sieht so billig aus.

Wieso ist das lokale F global deklariert, bzw. wo wurde es eigentlich deklariert?
Ups, versehentlich entfernt...

Und jupp, an die anonymen Methoden gewöhne ich mich auch so langsam, aber ob es hier wirklich sinnvoll/nötig ist, ist eine andere Frage
(aber oftmals machen sie den Code schon lesbarer, da der Code dann zwar nicht wiederverwendbar ist, aber wenigenstens, bei linearen Funktionen, im Kontext des aufrufenden Codes bleibt und man nicht erst suchen/umblättern muß ... z.B. bei Synchronize-Aufrufen ist das eine geile Angelegenheite und auch kleinere Thread-Prozeduren erstelle ich heutzutage anonym )
Das meinte ich mit meiner Frage vor allem. Danke auch an DayWalker9.
Wobei ich mir noch nicht sicher bin, was nun wirklich übersichtlicher ist. Für meinen vorliegenden Anwendungszweck bleibe ich wohl besser bei meiner Lösung. Ich finde das dann doch etwas strukturierter. Außerdem kann man so in übersichtlicher Weise ggf. verschiedene Comparer für verschiedene Zwecke zuweisen.


ExtractFileExt(sr.Name) = '.pdf' irgendwas.PDF oder x.PdF willst du nicht finden?
Stimmt, ich bessere das nach. Aber vorliegend war es kein Problem, da die pdf´s vom Programm selbst erzeugt werden.

Danke.


EDIT: @FredFesl
Da schließe ich mich mal nicht an. Die Lösung mit den Generics ist schon ganz nett.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 18:01
Delphi-Quellcode:
Function FileList (aPath : String) : TSearchRecList;
Begin
  Result := TSearchRecList.Create;
  Try
    ReadDirectory (aPath, Result);
    SortListByCreationData(Result);
  Except
    Result.Free;
    Result := Nil;
    Raise;
  End;
End;
Ist das nicht pfui bah wegen möglicher Speicherleks?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 18:16
Ich meine auch,
procedure FileList(aPath : String; DestList: TSearchRecList); wäre besser, Beispiele hatten wir doch letztens erst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#8

AW: Files suchen und sortieren

  Alt 12. Jul 2011, 19:50
Klar, geht auch. Hier ging es je eher um das Refactoring.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 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