Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Neuste Datei suchen ?!? (https://www.delphipraxis.net/47074-neuste-datei-suchen.html)

lorrey 6. Jun 2005 12:10


Neuste Datei suchen ?!?
 
Hallo !

Kurze Frage:

Wie kann ich am einfachsten die neuste(n) Datei(en) in einem Verzeichnis im Vergleich zu einem definierten DateTime Wert finden ?!?
Geht das ohne das ich mit "FindNext" alles durchlaufen muss ?!?

Danke und Gruss

Boombuler 6. Jun 2005 12:55

Re: Neuste Datei suchen ?!?
 
Denke mal nicht das du da herum kommst... Windows stellt nunmal nur FindFirst und FindNext zur verfügung...

Greetz
Boombuler

lorrey 6. Jun 2005 13:14

Re: Neuste Datei suchen ?!?
 
Das wäre ja echt ärgerlich !

Zumal müsste ich dann einen Loop über eventuell mehr als 1000 Dateien machen :-|

Das kann es ja eigentlich nicht sein ...
kann man nicht irgendwie vielleicht die Funktion vom Explorer nutzen und nach Datum/Zeit sortieren ?
Dann bräuchte man nur über Taggleiche Dateien loopen ... ?!?

Oder so ...

Luckie 6. Jun 2005 13:18

Re: Neuste Datei suchen ?!?
 
Zitat:

Zitat von lorrey
Zumal müsste ich dann einen Loop über eventuell mehr als 1000 Dateien machen :-|

Da wirst du nicht drumrumkommen.

Zitat:

Das kann es ja eigentlich nicht sein ...
Ist aber so.
Zitat:

kann man nicht irgendwie vielleicht die Funktion vom Explorer nutzen und nach Datum/Zeit sortieren ?
Der Benutzt genaud ie gleichen APIs.

Code dafür gibt es übrigens in der Code-Lib.

mr47 6. Jun 2005 13:27

Re: Neuste Datei suchen ?!?
 
Mal ganz logisch hinterfragt: Wie willst du die neuste Datei nehmen, wenn du keine Liste aller Dateien hast? Zu diesem Zeitpunkt weist du ja noch garnicht ob überhaupt so eine Datei existiert...

St.Pauli 6. Jun 2005 13:44

Re: Neuste Datei suchen ?!?
 
Zitat:

Zitat von lorrey
Das wäre ja echt ärgerlich !

Zumal müsste ich dann einen Loop über eventuell mehr als 1000 Dateien machen :-|

Das kann es ja eigentlich nicht sein ...
kann man nicht irgendwie vielleicht die Funktion vom Explorer nutzen und nach Datum/Zeit sortieren ?
Dann bräuchte man nur über Taggleiche Dateien loopen ... ?!?

Oder so ...


Wieso?

Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; const Mask: String;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
begin
  if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try
    repeat
      List.Add(Directory + SR.Name) // <- Hier den Vergleich einbauen und List.Add einfach entfernen...
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if (SR.Attr = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

begin
  List.BeginUpdate;
  try
    if ClearList then
      List.Clear;
    if Directory = '' then Exit;
    if Directory[Length(Directory)] <> '\' then
      Directory := Directory + '\';
    ScanDir(Directory);
  finally
    List.EndUpdate;
  end;
end;

function GetCreationTimeOfFile(const AFileName: String;): TDateTime;
var
  SR: TSearchRec;
  SystemTime: TSystemTime;
  NewCreationTime: TFileTime;
begin
  Result:=0;
  if FindFirst(AFileName, faAnyFile, SR)=0 then
  try
   IF (Windows.FileTimeToLocalFiletime(SR.FindData.ftCreationTime, NewCreationTime) and
           Windows.FileTimeToSystemTime(NewCreationTime, SystemTime)) Then
    Result:=Encodedate(SystemTime.wYear,
                       SystemTime.wMonth,
                        SystemTime.wDay) +
            Encodetime(SystemTime.wHour,
                       SystemTime.wMinute,
                       SystemTime.wSecond,
                       SystemTime.wMilliseconds);
  finally
   SysUtils.FindClose(SR)
  end;
end;
Bau hier gleich in der Suche ein, dass das du ein Datum z.B. als String speicherst, dass du dann immer mit der Aktuellen Datei vergleichst...
Wenn Altes neuer ist als Aktuelles, dann Altes = Aktuelles, ansonsten Altes = Altes...
Natürlich musst du auch den Namen der neusten Datei speicher. Das wäre schon alles. Nach einem *.* Durchlauf hättest du immer die neuste Datei, ohne auch nur eine Schleife zu brauche.

Wenn ich Fehler gemacht habe, mich bitte drauf hinweisen :angel2:

generic 6. Jun 2005 14:10

Re: Neuste Datei suchen ?!?
 
wenn dein programm live läuft bzw permanent läuft kannst du die neuen dateien mit den dateisystemevents fangen.

lorrey 6. Jun 2005 15:06

Re: Neuste Datei suchen ?!?
 
Echt ?
Kann man die Events von nur einem Verzeichnis triggern ?!?
Ansonsten macht diese Variante kein Sinn, wenn ich bei jeder neuen Datei ein Message bekomme...

Der Vorschlag von "St.Pauli" sieht eigentlich gut aus und ich denke viel anders wird es leider net gehen.

Luckie 6. Jun 2005 15:10

Re: Neuste Datei suchen ?!?
 
dann ist es eventuell das Hier im Forum suchenFindFirstChangeNotification was du suchst.

lorrey 7. Jun 2005 08:46

Re: Neuste Datei suchen ?!?
 
Super!

"FindFirstChangeNotification" sieht sehr gut aus - ich denke damit kann man was anfangen...!

Vielen Dank an alle die geholfen haben :-)


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