AGB  ·  Datenschutz  ·  Impressum  







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

FindFirst / FindLast

Ein Thema von value is NULL · begonnen am 10. Sep 2010 · letzter Beitrag vom 10. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#1

FindFirst / FindLast

  Alt 10. Sep 2010, 12:07
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

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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:19
[Glaskugel=ON]
Ich gehe davon aus, Du meist das Datum der Dateien?
[Glaskugel=OFF]

Schau mal nach "Fileage"

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:23
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#4

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:35
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

Geändert von mkinzler (10. Sep 2010 um 13:54 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:45
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:47
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 )


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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Sep 2010 um 12:51 Uhr)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 12:57
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.

Geändert von Satty67 (10. Sep 2010 um 13:02 Uhr)
  Mit Zitat antworten Zitat
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#8

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 13:06
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
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 13:25
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:
if ((sr.Attr and faDirectory) = faDirectory) then

Geändert von Satty67 (10. Sep 2010 um 13:35 Uhr)
  Mit Zitat antworten Zitat
value is NULL

Registriert seit: 10. Sep 2010
249 Beiträge
 
#10

AW: FindFirst / FindLast

  Alt 10. Sep 2010, 13:38
@ 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:11 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