Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TZipfile - ModifiedDateTime unter Linux und MAC falsch

  Alt 12. Dez 2021, 11:58
Es ist egal, mit welchem Programm oder auf welchem OS-System die ZIP-Datei erstellt wurde, TZIP-File gibt immer das falsche Datum und Uhrzeit zurück.

Zip-Dateien, die mit TZipl-File erstellt werden, werden aber von anderen Programmen richtig anzeigt (aber TZipfile zeigt die selbst erstellten auch falsch an).

Also ist es ein Ausleseproblem. Da kommen einige Ansatzpunkte in Betracht:

ModifiedDateTime ist als UNIT32 im TZipheader definiert:

Delphi-Quellcode:
TZipHeader = packed record
    MadeByVersion: UInt16; // Start of Central Header
    RequiredVersion: UInt16; // Start of Local Header
    Flag: UInt16;
    CompressionMethod: UInt16;
    ModifiedDateTime: UInt32;
    CRC32: UInt32;
Daher war eine erste Annahme, ob es etwas mit Integer-Problemen zu tun haben könnte, da auf den unterschiedlichen Plattformen einige Integertypen unterschiedliche Anzahl Bytes haben.

In der Procedure TZipFile.REadCentralHeader wird es dann so ausgelesen:

VerifyRead(FStream, LHeader.ModifiedDateTime, Sizeof(UInt32));
Ich habe nun festgestellt, dass auf allen Plattformen

Zipfile.FileInfo[c].ModifiedDateTime
den gleichen Wert zurückliefert, nur FileDateToDateTime liefert aber offenbar unterschiedliche Ergebnisse zurück.

Für Linux / MAC ist FileDatetoDateTime wie wolgt definiert:
Delphi-Quellcode:
function FileDateToDateTime(FileDate: LongInt): TDateTime;
var
  TempFileDate: time_t;
  UT: tm;
begin
  TempFileDate := FileDate;
  localtime_r(TempFileDate, UT);
  Result := EncodeDate(UT.tm_year + 1900, UT.tm_mon + 1, UT.tm_mday) +
              EncodeTime(UT.tm_hour, UT.tm_min, UT.tm_sec, 0);
end;

Geändert von Harry Stahl (12. Dez 2021 um 12:15 Uhr)
  Mit Zitat antworten Zitat