![]() |
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 |
AW: FindFirst / FindLast
[Glaskugel=ON]
Ich gehe davon aus, Du meist das Datum der Dateien? [Glaskugel=OFF] Schau mal nach "Fileage" Mavarik |
AW: FindFirst / FindLast
Mit
![]() ![]() 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) |
AW: FindFirst / FindLast
hm.. so bewandert bin ich leider noch nicht,
ich kann mit folgender funktion das Erstellungsdatum der Ordner vergleichen:
Delphi-Quellcode:
nur wie müsste dann die schleife aussehen, in der ich alle ordner auf das datum prüfe und mir hierbei
########################################################################
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; ######################################################################## das älteste und das neueste suche ? Danke schon mal LG Steffen das ist ja eigentlich das was ich benötige |
AW: FindFirst / FindLast
Zitat:
Delphi-Quellcode:
if FindFirst(...) then
begin oldestdate := SearchRec....; newestdate := SearchRec....; repeat [...] until FindNext(....); FindClose(...); end; |
AW: FindFirst / FindLast
Wenn du das Datum nur vergleichen willst, dann könntest mußt du die Zeitzone nicht umrechnen.
Delphi-Quellcode:
PS: Bei FAT wird die Zeitzone nicht gespeichert, aber via NTFS sollte Zeitzone eh schon von Windows im FindFirst/FindNext eingerechnet sein.
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; 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) |
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. |
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 |
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:
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.
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; 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
|
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 23:19 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