AGB  ·  Datenschutz  ·  Impressum  







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

Altes Thema kurze Frage zu FileAge

Ein Thema von cramer · begonnen am 31. Jan 2014 · letzter Beitrag vom 5. Feb 2014
Antwort Antwort
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#1

Altes Thema kurze Frage zu FileAge

  Alt 31. Jan 2014, 09:27
Delphi-Version: 2006
Hallo,

auf der Suche nach dem Sommer/Winterzeit Unterschied beim Datei Änderungszeitpunkt in unterschiedlichen Filesystemen stellt sich mir die Frage nach der Auflösung von fileAge.

qFiles = Netware Volume
zFiles = NTFS Volume
Delphi-Quellcode:
qAge := fileAge( qFile );
zAge := fileAge( zFile );
qtime := FileDateToDateTime(qAge);
ztime := FileDateToDateTime(zAge);
difAge := abs( qAge - zAge );
difSec := SecondsBetween(qTime,zTime);
MyDebug('DifSec ' + IntToStr(difSeconds) + ' - DifAge ' + IntToStr(DifAge) );
[9656] myDebug DifSec 3599 - DifAge 2048
[9656] myDebug DifSec 3600 - DifAge 2048

difAge ergibt bei einer Zeitdifferenz von 1 Stunde immer 2048
difSec ergibt bei einer Zeitdifferenz von 1 Stunde 3599/3600 *
* je nach Abschneiden der Millisekunden durch die buggy SecondsBetween function

Nach welchen Kriterien wird denn der FileAge Integer gebaut,
daß sich ein Faktor von ca. 1:1,75 zu den Sekunden ergibt?
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: Altes Thema kurze Frage zu FileAge

  Alt 31. Jan 2014, 12:21
Ich verstehe Deine Frage nicht wirklich.
Zu dem Problem Sommerzeit/Winterzeit kann ich jedoch etwas beitragen. Bei der Berechnung des Dateidatums hat man es sich unter Windows leider sehr einfach gemacht (FileAge benutzt FileTimeToLocalFileTime). Zunächst muss man wissen, dass einige Dateisystem die Zeiten intern als UTC und einige als lokale Zeit speichern. Bei FAT/FAT32/Netware wird die Zeit als lokale Zeit, bei NTFS und CDFS als UTC gespeichert. Fileage rechnet immer auf die lokale Zeit um. Bei FAT muss also lediglich die lokale Zeit 1:1 ausgegeben werden. Bei NTFS muss hingegen gerechnet werden. Bei der Berechnung wird aber nicht der UTC-Bias zum Zeitpunkt des Dateidatums herangezogen, sondern der aktuelle UTC-Bias. Das führt dazu, dass sich nach der Sommerzeit/Winterzeit-Umschaltung das Dateidatum aller Dateien bei einem UTC-Filesystem ändern. Will man die korrekte lokale Zeit bekommen, ist die Funktion Fileage unbrauchbar. Um die korrekte lokale Zeit zu bekommen, muss zunächst das UTC-Dateidatum ermittelt werden. Dann muss der passende UTC-Bias dazu berechnet werden. Im nächsten Schritt kann dann mit dem UTC-Bias das lokale Dateidatum berechnet werden.
Die Auflösung des Dateidatums bei FAT/FAT32 ist 2 Sekunden. Bei NTFS ist es theoretisch 100 Nanosekunden.
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#3

AW: Altes Thema kurze Frage zu FileAge

  Alt 4. Feb 2014, 17:29
Sorry, bin erst jetzt wieder im Büro.

Meine Frage zielte auf den seltsamen Wert 2048 = 1 Stunde = 3600 Sekunden hin.
Angenommen Borland ermittelt den Wert gem. FAT-Spezifikation und 2 Sekunden Auflösung, hätte ich 1800 erwartet.

Ist aber auch egal, ich ermittle nun grob die Differenz nach FileAge und wenn diese < 2050 liegt, gehts in die Feinheiten und Sekunden.

Trotzdem Danke für die Infos.
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Altes Thema kurze Frage zu FileAge

  Alt 4. Feb 2014, 17:42
MSDN-Library durchsuchenFILETIME
Zitat:
It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.
Mehr gibt es da eigentlich nicht zu sagen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
108 Beiträge
 
Delphi 2006 Enterprise
 
#5

AW: Altes Thema kurze Frage zu FileAge

  Alt 4. Feb 2014, 20:33
Na ja, aber vielleicht noch zu fragen, soll das heißen, der sogenannte FileAge integer ist in wirklichkeit eine Filetime Struktur?

Gibt es denn Erfahrungswerte mit welcher API man unter Windows z.B. bei rund 600000 Dateien das Änderungsdatum zweier Dateien am schnellsten unter Berücksichtigung der unterschiedlichen Filesysteme und der lokalen Zeit ermitteln und vergleichen kann?
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Altes Thema kurze Frage zu FileAge

  Alt 4. Feb 2014, 20:55
Das alte DOS-Format sollte man gleich vergessen.

MSDN-Library durchsuchenGetFileTime

Es kommt auch erstmal darauf an, um welches Datum es sich handelt, denn die haben teilweise eine unterschiedliche Auflösung.
Dann müsste man auslesen um welches Dateisystem (Treiber) es sich handelt und eventuell wie der eingestellt ist, denn NTFS hat z.B. für SSDs einen anderen Modus, wo nicht mehr jedes Datum gespeichert wird, bzw. manchmal auch verzögert oder in einer anderen Auflösung.

Die Zahlenwerte ändern sich aber nicht, um mal auf deine 1800 anzuspielen ... bei halber Auflösung gibt es einfach nur jeden zweiten Wert nicht.


Entsprechend der Dateisysteme/Einstellungen muß man beim Vergleichen eine ensprechende Tolleranz zulassen.

Eventuell muß man auch noch die Zeitzone umrechnen, wenn man über zwei Partitionen hinweg vergleicht.


PS: Ich hatte damals aufgegeben, als ich tagelang versuchte das umzusetzen.
$2B or not $2B
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Altes Thema kurze Frage zu FileAge

  Alt 5. Feb 2014, 10:29
Es gibt verschiedene Versionen von FILEAGE:

Alt:
function FileAge(const FileName: string): Integer; overload;
Neu:
function FileAge(const FileName: string; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;

Siehe:
http://docwiki.embarcadero.com/Libra...sUtils.FileAge
http://docwiki.embarcadero.com/CodeE...r_%28Delphi%29

Ausserdem:
Bug NOVELL:
http://forum.delphi-treff.de/index.p...&threadID=9416

Geändert von hathor ( 5. Feb 2014 um 10:44 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#8

AW: Altes Thema kurze Frage zu FileAge

  Alt 5. Feb 2014, 11:15
Gibt es denn Erfahrungswerte mit welcher API man unter Windows z.B. bei rund 600000 Dateien das Änderungsdatum zweier Dateien am schnellsten unter Berücksichtigung der unterschiedlichen Filesysteme und der lokalen Zeit ermitteln und vergleichen kann?
Die Windows-Api/Delphi kann das überhaupt nicht (wie ich schon erläuterte). Das muss man selber machen. Perfekt bekommt man das nicht hin, weil FAT/FAT32/Novell halt leider lokale Zeiten speichern und man deshalb nicht mehr eindeutig zu UTC zurück kommt.
Der Totalcommander versucht das Problem mit Hilfe einer Toleranzschwelle von einer Stunde zu lösen. Das geht aber spätestens schief, wenn man es mit unterschiedlichen Zeitzonen zu tun hat.
Das Performance-Problem ist doch nicht die Berechnung, sondern der Flaschenhals ist der Directory-Scan. Bei jedem FileAge wird erneut das Directory durchsucht. Das dauert "ewig" im Vergleich zu einer umfangreichen Berechnung des Dateidatums (also mit korrekte Berücksichtigung des UTC-Bias und dem zugrunde liegenden Dateisystems).

Geändert von samso ( 5. Feb 2014 um 11:22 Uhr)
  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 00:56 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