Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi FindFirst / FindLast (https://www.delphipraxis.net/154434-findfirst-findlast.html)

value is NULL 10. Sep 2010 11:07

FindFirst / FindLast
 
Hallo alle zusammen,

bin neu hier im Forum und konnte leider keinen nützlichen Beitrag finden der mich zur gewünschten Lösung führt :pale:

Aufgabenstellung ist folgende:
ich habe ein WorkingDirectory welches wie folgt aufgebaut ist:
workingdir
- 20100909
- 20100910
usw. sprich immer das aktuelle Datum und darin liegen diverse Files

Meinem Programm gebe ich einen Parameter mit, welcher bestimmt, wie groß das workingdir werden darf.
Ist diese Größe erreicht muss der Folder lediglich umbenannt werden und zwar nach:
YYYY-MM-DD - YYYY-MM-DD
wobei das erste Datum das älteste ist und das zweite das aktuellste

Wie frage ich also ob, welches das älteste bzw. das neueste ist.

Sorry falls dieses Thema oder ein so ähnliches schon mal behandelt wurde, ich habe leider nichts gefunden :(

LG
Steffen

Mavarik 10. Sep 2010 11:19

AW: FindFirst / FindLast
 
[Glaskugel=ON]
Ich gehe davon aus, Du meist das Datum der Dateien?
[Glaskugel=OFF]

Schau mal nach "Fileage"

Mavarik

himitsu 10. Sep 2010 11:23

AW: FindFirst / FindLast
 
Mit Delphi-Referenz durchsuchenFindFrist und Delphi-Referenz durchsuchenFindNext kannst du das Verzeichnis einlesen.

Dabei zählst du die Dateien zusammen, welche du findest ... für den Vergleich mit der maximalen Größe

und kannst dir auch gleichzeitig noch die jüngste und älteste Datei merken.
Vorher jeweils eine Variable für das jüngste und älteste Datum anlegen und mit einem Datum in der fernen Zukunft (für das Neuste), bzw. aus der Vergangenheit (für das Älteste) initialisieren.
Nun brauchst du nur noch vergleichen, ob das Datum jeweil kleiner/größer, bzw. neuer/älter ist und wenn dieses der Fall ist, dann wird die Variable geändert.

Tja, nun nur noch die Größe vergleichen und wenn nötig umbennenen.
> Die Datums- und Größenangaben hast du dafür ja nun auch schon beisammen.

@Mavarik: Klar kann man das Dateidatum nochmal getrennt auslesen, aber FindFirst/FindNext liefern dieses auch schon. (auch wenn man, vor Delphi 2011/XE, dieses oftmals noch umrechnen müßte)

value is NULL 10. Sep 2010 11:35

AW: FindFirst / FindLast
 
hm.. so bewandert bin ich leider noch nicht,

ich kann mit folgender funktion das Erstellungsdatum der Ordner vergleichen:

Delphi-Quellcode:
########################################################################
function FileCreated(fn: TFileName): TDateTime;
var
  sr: TSearchRec;
  tzi: TTimeZoneInformation;
  lt, st: TSystemTime;
begin
  if FindFirst(fn, faAnyFile, sr) = 0 then
  begin
    GetTimeZoneInformation(tzi);
    FileTimeToSystemTime(sr.FindData.ftCreationTime, st);
    SystemTimeToTzSpecificLocalTime(@tzi, st, lt);
    Result := SystemTimeToDateTime(lt);
    SysUtils.FindClose(sr);
  end else Result := 0;
end;
########################################################################
nur wie müsste dann die schleife aussehen, in der ich alle ordner auf das datum prüfe und mir hierbei
das älteste und das neueste suche ?

Danke schon mal

LG Steffen

das ist ja eigentlich das was ich benötige

SirThornberry 10. Sep 2010 11:45

AW: FindFirst / FindLast
 
Zitat:

Zitat von himitsu (Beitrag 1048664)
Vorher jeweils eine Variable für das jüngste und älteste Datum anlegen und mit einem Datum in der fernen Zukunft (für das Neuste), bzw. aus der Vergangenheit (für das Älteste) initialisieren.

Das ist gar nicht notwendig das man Fantasiedaten nimmt. Man kann die Werte für älteste und neueste Datei einfach von der ersten gefundenen nehmen. Pseudocode:
Delphi-Quellcode:
if FindFirst(...) then
begin
  oldestdate := SearchRec....;
  newestdate := SearchRec....;
  repeat
    [...]
  until FindNext(....);
  FindClose(...);
end;

himitsu 10. Sep 2010 11:47

AW: FindFirst / FindLast
 
Wenn du das Datum nur vergleichen willst, dann könntest mußt du die Zeitzone nicht umrechnen.
Delphi-Quellcode:
function FileCreated(fn: TFileName): TDateTime;
var
  sr: TSearchRec;
  st: TSystemTime;
begin
  if FindFirst(fn, faAnyFile, sr) = 0 then
  begin
    >>>>
    FileTimeToSystemTime(sr.FindData.ftCreationTime, st);
    Result := SystemTimeToDateTime(st);
    <<<<
    SysUtils.FindClose(sr);
  end else Result := 0;
end;
PS: Bei FAT wird die Zeitzone nicht gespeichert, aber via NTFS sollte Zeitzone eh schon von Windows im FindFirst/FindNext eingerechnet sein.

PSS: neben .ftCreationTime gibt es auch noch 2 andere Zeitangaben.
(z.B. eine für die letzte Änderung :wink: )


Nja, hier übergibst du einen Dateinamen und ließt nur dessen Datum aus.
Wenn du via FindFirst/FindNext das ganze Verzeichnis ausließt, dann kannst du in dieser Schleife genau das Selbe mit diesen Datumswerten machen.


SirThornberry:
Ja OK, das kann man, aber dafür muß man die Dateiauswertung doppelt vornehmen (einmal für die Erste und dann nochmal für alle restlichen Dateien).
Da sind die 2 Zeilen für das Initialisieren meißt schneller/kleiner/einfacher.

PS: Wenn mal keine Dateien vorhanden sind, dann hat hat man so auch gleich ein paar "Default"-Wert in diesen Variablen. (ich bin Faul und nehm da lieber die kleine Initialisierung)

Satty67 10. Sep 2010 11:57

AW: FindFirst / FindLast
 
Ich denke er will (wenn Workdir eine gewisse Dattengröße hat) aus den Unterordnernamen einen neuen Namen für Workdir erzeugen.

Da die Unterordner ein verdrehtes Datum als Namen besitzen, soll der neue Name für Workdir eine Zeitspanne (im o.a. Format) darstellen... basierend auf den verdrehten Datum der Unterordner.

oder?

Wenn ja.. die Unterordnernamen liegen ja schon in einem sortierfähigen Format vor. Einfach auslesen und per Stringvergleich größten und kleinsten String merken.

value is NULL 10. Sep 2010 12:06

AW: FindFirst / FindLast
 
hm ok aber genau hier liegt ja mein problem

und zwar bei der schleife wo ich praktisch das workingdir auf unterordnerprüfe und den neuesten und ältesten unterordner
auslesen möchte ...

da ist irgendwie ne denkblockade gerade :(

ich spiele mich mit delphi seit 1 monat also is das für mich alles noch ziemlich arabisch ^^

LG

Satty67 10. Sep 2010 12:25

AW: FindFirst / FindLast
 
Mit FindFirst/FindNext nur die Unterordner einlesen und die Ergebnisse einfach mit < > Vergleichen und merken. aus dem Ergebnis ein String basteln...
Delphi-Quellcode:
function GetLoHiSubDirs(aDirectory : String): String;
var
  sr : TSearchRec;
  loStr, hiStr : String;
begin
  loStr := '99999999';
  hiStr := '00000000';
  aDirectory := IncludeTrailingPathDelimiter(aDirectory) + '*.*';

  if FindFirst(aDirectory, faAnyFile, sr) = 0 then
  begin
    try
      repeat
        if (sr.Name[1] <> '.')
        and ((sr.Attr and faDirectory) = faDirectory) then
        begin
          if sr.Name < loStr then
            loStr := sr.Name;
          if sr.Name > hiStr then
            hiStr := sr.Name;
        end;
      until FindNext(sr) <> 0;
    finally
      FindClose(sr);
    end;
  end;

  Insert('-', loStr, 7);
  Insert('-', loStr, 5);
  Insert('-', hiStr, 7);
  Insert('-', hiStr, 5);
  result := loStr +' - '+ hiStr;
end;
Es wird für das kleinste Datum erstmal das größtmögliche gespeichert (99999999), und dann bei der Suche durch kleinere Datum ersetzt.Beim größten Datum genau umgekehrt.

Der Rest ist nur die Funktionsweise von FindFirst/FindNext zu verstehen und das Ergebnis (mit Insert) aufzuhübschen.

PS: Versuche vor allem die Bit-Operation zu verstehen, sowas wirst Du häufiger brauchen:
Delphi-Quellcode:
if ((sr.Attr and faDirectory) = faDirectory) then

value is NULL 10. Sep 2010 12:38

AW: FindFirst / FindLast
 
@ Satty 67

wow, funktioniert perfekt! also das war eindeutig zu hoch für mich :) aber es funkt!

Danke Danke, jetzt versuch ich das ganze noch zu verstehen dann hab ichs glaub ich :)

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.
Seite 1 von 2  1 2      

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