AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [D5] Dateidatum wird falsch gelesen
Thema durchsuchen
Ansicht
Themen-Optionen

[D5] Dateidatum wird falsch gelesen

Ein Thema von JanWe · begonnen am 16. Apr 2015 · letzter Beitrag vom 18. Apr 2015
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 15:41
äh, mhh, jetzt ich bin langsam verwirrt
Das brauchst du nicht, aber vielleicht weigerst du dich einfach nur paar Tatsachen zu akzeptieren. Eine wäre, es gibt keine Dateien die vor 1980 auf einem PC abgelegt sein können. Gut, ich dachte es war 1970, ist aber nicht so wichtig. Es ist irgendwas dazwischen. Der Grund ist, 1980 war der Speicher verdammt teuer, da verplempert man den nicht mit unwichtigen Daten, die es davor nicht gab, wie z. B. den Brief von Pontius Pilatus an das römische Senat, verfasst in Word 0.1 im Jahr... so um 30. Damals gab es keine Computer. Auch hat Luther seine Thesen nicht in Word 0.3 geschrieben. Auch da gab es keine Computer. Der PC wurde so um 1976/77 erfunden. Somit wurden davor keine Daten auf den PC abgelegt.

Wozu also Speicher für Daten bereithalten, die es vor 1970 nicht gab. Für das Jahr 1968 braucht man zusätzliche 7 Bits. Wofür. Also hat man getrickst und beschlossen, die Zeitrechnung auf Computern beginnt im Jahr 1970 (oder so ähnlich). Wenn also im Jahr 2015 eine Datei abgespeichert wird, wird nur das Jahr 45 gespeichert. Fragt man das System jetzt wann die Datei gespeichert wurde, nimmt es die 45 und addiert 1970 dazu. Ergebnis 2015. Ist ein Trick, man spart 7 Bits.

Deshalb kann es auch keine Datum-Daten vor vor 1970 geben, denn das System kann nicht kleinere Werte als 0 ablegen. Somit kann jede Datei ohne Datum nur mit 1970 anfangen.

Und nun kommst du mit deinem Delphi-Datum an. Auch Delphi muss tricksen, damit es ein Datum plus Uhrzeit in eine Double speichern kann. Ein Double kommt mit 8 Bytes aus. Das würde nicht für ein volles Datum reichen, aber Delphi ist großzügiger, es beginnt bei 1900.

Also, es gibt keine Daten von vor 1970, also findet sich auf dem System auch kein Datum von vor 1970. Das solltest du akzeptieren.

Zitat:
also ich möchte alle Dateien in einem Verzeichnis scannen und das korrekte Dateidatum ermitteln. Naja OK, die weitere Speicherung ist zweitrangig - und wie sich ja ergeben hat, als integer - auch weniger leicht.
Das ist superleicht. Nichts leichter als das Dateidatum zu speichern. Nur man kann dir hundert mal sagen wie du es machen sollst, du weigerst dich einfach. Du willst unbedingt dein Delphi-Datum speichern und das geht nicht mit einem Integer. Das Time-Datum der Datei ist aber schon ein Integer. Und was du dich seit Stunden weigerst zu machen ist einfach den Search.Time Wert zu speichern, statt das FileDateToDateTime. Wo ist das Problem die Funktion FileDateToDateTime zu entfernen und schon hat man das was man will. Aber nö, du willst unbedingt das FileDateToDateTime Datum speichern. Dann versuche es weiter.

Zitat:
a) Aber was ich nicht verstehe ist, warum Dateien mit dem Datum vor 1.1.1980 (gerade festgestellt ... Dateidatum VOR 1980 macht schon Probleme) von Delphi nicht mit searchrec.time ermittelt werden können?
Wie gesagt, den Grund wurde dir schon vor Stunden genannt. Du weigerst dich das einfach zu verstehen.

Geändert von Popov (17. Apr 2015 um 15:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JanWe
JanWe

Registriert seit: 23. Mär 2015
Ort: NRW
79 Beiträge
 
Delphi 7 Personal
 
#2

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 18:11
ha!
jo, entschuldigt, wenn ich Euch auf die Nerven gegangen bin.

naja, für mich war das logisch die ins normale DateTime konvertierte FileDateTime zu speichern, weil ich dachte, mit dem DateTime würde man öfter rechnen, da ich beim Implementieren im web/google und in delphi foren viel über das Gemaule/Unverständnis beim Weiterverarbeiten vom unkonvertierten Dateidatum gestolpert war, und das bei mir vermeiden wollte ;D

nein, von daher hab ich die Integer nicht ingoriert. Ich hielt sie einfach nur nicht für ein "richtiges" Datum wegen FileTime<>Datum u. Zeit

Mhh, ja und die Dateien kommen bei mir schon vor.
Nicht von CDs oder gar überspielten 5¼" Disketten des "Brotkastens" (c64).
Ich hab nämlich mit dem SpeedCommander per normalem FTP von einigen Servern heruntergeladen und das Dateidatum mit übernommen ... und da haben die Server wohl Mist gesendet: Denn teilweise wurde dabei das Lastchange auf 1.1.1970 gesetzt.

Von daher is das für mich natürlich schon wichtig, da ich die alle katalogisieren wollte.

Also noch einmal herzlichen Dank an ALLE!
Jan

Geändert von JanWe (17. Apr 2015 um 18:16 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 18:38
Wie schon gesagt, man kann das Search.Time speichern und FileDateToDateTime nutzen wenn man es benötigt.

Wenn es aber unbedingt sein muss, obwohl, ob ich nun mit FileDateToDateTime beizeiten das Datum passend konvertiere oder es vorher durch 100000 tiele, ist eigentlich gehopst wie gesprungen.

Aber wenn unbedingt sein muss, wenn du Datum und Uhrzeit trennst, also jede der Angaben separat speicherst, dann sollte das auch mit Integer gehen:
Delphi-Quellcode:
var
  Datum, Uhrzeit: Integer;
  DateTime: TDateTime;
begin
  Datum := Trunc(Now);
  Uhrzeit := Trunc((Now - Datum) * 100000);

  DateTime := Datum + (Uhrzeit / 100000);
  ShowMessage(DateTimeToStr(DateTime));
end;
Zitat:
Denn teilweise wurde dabei das Lastchange auf 1.1.1970 gesetzt.
Kommt schon vor, nur ältere Daten wirst du nicht bekommen. Wie gesagt, das ist das Jahr 0 bei Computern. Dieses Datum siehst du wenn im Speicher 0 steht. Was du siehst ist nur die bereinige Version.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 19:10
Jain. 0 ist nicht konvertierbar. Geht erst ab 2162688 (1.1.80). (Siehe auch himitsu)
Delphi-Quellcode:
  I := DateTimeToFileDate(StrToDateTime('1.1.1980'));
  ShowMessage(DateTimeToStr(FileDateToDateTime(I - 1))); // -> Exception
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#5

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 19:35
Jain. 0 ist nicht konvertierbar. Geht erst ab 2162688 (1.1.80). (Siehe auch himitsu)
Um genau zu sein:

2162688 entspricht dem 01.01.1980 um 00:00:01 Uhr.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 21:36
Gerade habe ich eine Textdatei erstellt und nachträglich Erstelldatum sowie Änderungdatum geändert. Seltsamerweise zeigt der FreeCommander das korrekte Änderungsdatum 17.04.1970 22:45 an, der Windows-Explorer zeigt dagegen gar kein Datum an. Auch ein Änderungsdatum 23.08.1804 01:15 wird nach Eingabe im FreeCommander korrekt angezeigt. Also irgendwie muß der FreeCommander das ja auch speichern und auslesen. Offenbar gibt es hier doch weitere Möglichkeiten, obwohl es ja laut Popov gar nicht möglich ein sollte, ein solches Datum überhaupt erst zu erzeugen bzw. einer Datei zuzuweisen.

Geändert von Perlsau (17. Apr 2015 um 21:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.233 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 22:09
NTFS hat einen grösseren Datumsbereich als Fat. Und mit den richtigen Api bekommt man die auch zu gesicht
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: [D5] Dateidatum wird falsch gelesen

  Alt 17. Apr 2015, 22:55
Bjoerk und BadenPower

Ich könnte beschwören bei einigen gecrashten Festplatten, Disketten und Sonstigem eine 7 als Dekadenwert gesehen zu haben. Ob es eine 70 oder 7x gewesen ist, weiß ich nicht, aber ich kann mich gut dran erinnern. Auf der anderen Seite hatte ich mich nie genauer damit auseinander gesetzt, somit will ich nichts genau behaupten. Man sollte aber bedenken, das man das Jahr der PC Geburt auf 1976/77 beziffert. Andererseits kam das was man heute allgemein als PC ansieht, wobei es eigentlich nur der IBM-PC kompatible PC ist, 1981 raus. Trotzdem, unsere PCs sind nur die verbesserten Nachbauten des damaligen IBM-PCs. Damit ist anzunehmen, dass Microsoft bei seinem MS-DOS, was eigentlich das 1980 fertiggestellte QDOS von Tim Paterson ist, die Zeitrechnung auf 1980 gesetzt hat. Wobei eigentlich anzunehmen ist, dass das BIOS das Datum liefern sollte. Letztendlich, ich weiß es nicht. Man sollte aber bedenken, dass andere Systeme (vor allem über FTP) durchaus andere Startzeiten haben und vielleicht berücksichtigen einige Programme dies.

Aber wo wir dabei sind, hier der Quellcode der Funktion FileDateToDateTime:
Delphi-Quellcode:
function FileDateToDateTime(FileDate: Integer): TDateTime;
begin
  Result :=
    EncodeDate(
      LongRec(FileDate).Hi shr 9 + 1980,
      LongRec(FileDate).Hi shr 5 and 15,
      LongRec(FileDate).Hi and 31) +
    EncodeTime(
      LongRec(FileDate).Lo shr 11,
      LongRec(FileDate).Lo shr 5 and 63,
      LongRec(FileDate).Lo and 31 shl 1, 0);
end;
Da wird frech 1980 dazu gezählt.


obwohl es ja laut Popov gar nicht möglich ein sollte, ein solches Datum überhaupt erst zu erzeugen bzw. einer Datei zuzuweisen.
Es gibt meiner Kenntnis nach insgesamt 4 Quellen für ein Datum. Das gewöhnliche Time, sowie drei bei TWin32FindData. Time ist Typ Integer, die drei Zeiten bei TWin32FindData sind Longword. Time ist alt, TWin32FindData ist neuer. Vielleicht wird da was anders gespeichert.
  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 08:38 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