ADD: Wcx-plugins - more accurate time support

This commit is contained in:
Alexander Koblov 2024-06-16 14:59:39 +03:00
commit 1b9671eda7
9 changed files with 49 additions and 24 deletions

View file

@ -4,7 +4,7 @@
Date and time functions.
Copyright (C) 2009-2012 Przemysław Nagay (cobines@gmail.com)
Copyright (C) 2017-2022 Alexander Koblov (alexx2000@mail.ru)
Copyright (C) 2017-2024 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -35,6 +35,9 @@ uses
{$ENDIF}
;
const
DATE_TIME_NULL = TDateTime(2958466.0);
function FileTimeToDateTime(FileTime : DCBasicTypes.TFileTime) : TDateTime;
function FileTimeToDateTimeEx(FileTime : DCBasicTypes.TFileTimeEx) : TDateTime;
function DateTimeToFileTime(DateTime : TDateTime) : DCBasicTypes.TFileTime;

View file

@ -132,6 +132,7 @@ typedef struct {
int CmtSize;
int CmtState;
char Reserved[1024];
uint64_t MfileTime;
} tHeaderDataExW;
typedef struct {

View file

@ -179,6 +179,7 @@ type
CmtSize,
CmtState:longint;
Reserved:array[0..1023] of char;
MfileTime: UInt64;
end;
tOpenArchiveData=packed record

View file

@ -123,7 +123,7 @@ begin
begin
Inc(FStatistics.Files);
FStatistics.Size := FStatistics.Size + Header.UnpSize;
ModificationTime:= WcxFileTimeToDateTime(Header.FileTime);
ModificationTime:= Header.DateTime;
if ModificationTime < FStatistics.OldestFile then
FStatistics.OldestFile := ModificationTime;
if ModificationTime > FStatistics.NewestFile then

View file

@ -423,7 +423,7 @@ begin
Result:= rsMsgFileExistsOverwrite + LineEnding + aTargetHeader.FileName + LineEnding;
Result:= Result + Format(rsMsgFileExistsFileInfo, [IntToStrTS(aTargetHeader.UnpSize),
DateTimeToStr(WcxFileTimeToDateTime(aTargetHeader.FileTime))]) + LineEnding;
DateTimeToStr(aTargetHeader.DateTime)]) + LineEnding;
Result:= Result + LineEnding + rsMsgFileExistsWithFile + LineEnding + aSourceFile.FullPath + LineEnding +
Format(rsMsgFileExistsFileInfo, [IntToStrTS(aSourceFile.Size), DateTimeToStr(aSourceFile.ModificationTime)]);
@ -439,7 +439,7 @@ const
function OverwriteOlder: TFileSourceOperationOptionFileExists;
begin
if aSourceFile.ModificationTime > WcxFileTimeToDateTime(aTargetHeader.FileTime) then
if aSourceFile.ModificationTime > aTargetHeader.DateTime then
Result := fsoofeOverwrite
else
Result := fsoofeSkip;

View file

@ -555,7 +555,7 @@ var
PathIndex: Integer;
TargetDir: String;
Header: TWCXHeader;
Time: TFileTime;
Time: TFileTimeEx;
begin
Result := True;
@ -572,10 +572,10 @@ begin
// Restore attributes
mbFileSetAttr(TargetDir, Header.FileAttr);
Time := WcxFileTimeToFileTime(Header.FileTime);
Time := DateTimeToFileTimeEx(Header.DateTime);
// Set creation, modification time
mbFileSetTime(TargetDir, Time, Time, Time);
mbFileSetTimeEx(TargetDir, Time, Time, Time);
except
Result := False;
@ -627,7 +627,7 @@ var
function OverwriteOlder: TFileSourceOperationOptionFileExists;
begin
if WcxFileTimeToDateTime(Header.FileTime) > FileTimeToDateTime(mbFileAge(AbsoluteTargetFileName)) then
if Header.DateTime > FileTimeToDateTime(mbFileAge(AbsoluteTargetFileName)) then
Result := fsoofeOverwrite
else
Result := fsoofeSkip;
@ -677,7 +677,7 @@ begin
end;
end;
Message:= FileExistsMessage(AbsoluteTargetFileName, Header.FileName,
Header.UnpSize, WcxFileTimeToDateTime(Header.FileTime));
Header.UnpSize, Header.DateTime);
FCurrentFilePath := Header.FileName;
FCurrentTargetFilePath := AbsoluteTargetFileName;
case AskQuestion(Message, '',

View file

@ -477,14 +477,8 @@ begin
SizeProperty.IsValid := (WcxHeader.UnpSize >= 0);
CompressedSizeProperty := TFileCompressedSizeProperty.Create(WcxHeader.PackSize);
end;
ModificationTimeProperty := TFileModificationDateTimeProperty.Create(0);
ModificationTimeProperty.IsValid := (WcxHeader.FileTime > 0);
if ModificationTimeProperty.IsValid then
try
ModificationTime := WcxFileTimeToDateTime(WcxHeader.FileTime);
except
on EConvertError do ModificationTimeProperty.IsValid := False;
end;
ModificationTimeProperty := TFileModificationDateTimeProperty.Create(WcxHeader.DateTime);
ModificationTimeProperty.IsValid := (WcxHeader.DateTime <= SysUtils.MaxDateTime);
// Set name after assigning Attributes property, because it is used to get extension.
Name := ExtractFileNameEx(WcxHeader.FileName);
@ -679,7 +673,7 @@ var
AllDirsList, ExistsDirList : TStringHashListUtf8;
I : Integer;
NameLength: Integer;
ArchiveTime: LongInt;
ArchiveTime: TDateTime;
begin
Result:= False;
@ -746,7 +740,7 @@ begin
if FOpenResult <> E_SUCCESS then Exit;
end; // while
ArchiveTime:= FileTimeToWcxFileTime(mbFileAge(ArchiveFileName));
ArchiveTime:= FileTimeToDateTime(mbFileAge(ArchiveFileName));
(* if plugin does not give a list of folders *)
for I := 0 to AllDirsList.Count - 1 do
@ -759,7 +753,7 @@ begin
Header.FileName := AllDirsList.List[I]^.Key;
Header.ArcName := ArchiveFileName;
Header.FileAttr := GENERIC_ATTRIBUTE_FOLDER;
Header.FileTime := ArchiveTime;
Header.DateTime := ArchiveTime;
AFileList.Add(Header);
except

View file

@ -630,7 +630,7 @@ var
Exit(False);
if (IsDateFrom or IsDateTo or IsTimeFrom or IsTimeTo or IsNotOlderThan) then
Result := CheckFileDateTime(FFileChecks, WcxFileTimeToDateTime(FHeader.FileTime));
Result := CheckFileDateTime(FFileChecks, FHeader.DateTime);
if (IsFileSizeFrom or IsFileSizeTo) and Result then
Result := CheckFileSize(FFileChecks, FHeader.UnpSize);

View file

@ -3,7 +3,7 @@
-------------------------------------------------------------------------
Archive File support - class for manage WCX plugins (Version 2.20)
Copyright (C) 2006-2018 Alexander Koblov (alexx2000@mail.ru)
Copyright (C) 2006-2024 Alexander Koblov (alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -47,15 +47,18 @@ Type
{ Handles THeaderData and THeaderDataEx }
TWCXHeader = class(TObjectEx)
private
FileTime: LongInt;
FDateTime: TDateTime;
FNanoTime: TWinFileTime;
private
function GetDateTime: TDateTime;
function PCharLToUTF8(CharString: PChar; MaxSize: Integer): String;
public
ArcName: String;
FileName: String;
Flags,
HostOS,
FileCRC,
FileTime,
UnpVer,
Method: Longint;
FileAttr: TFileAttrs;
@ -70,6 +73,8 @@ Type
constructor Create(const Data: PHeaderDataEx); overload;
constructor Create(const Data: PHeaderDataExW); overload;
constructor Create; overload; // allows creating empty record
property DateTime: TDateTime read GetDateTime write FDateTime;
end;
@ -867,12 +872,31 @@ begin
if Assigned(Data^.CmtBuf) then
Cmt := PCharLToUTF8(Data^.CmtBuf, Data^.CmtSize);
CmtState := Data^.CmtState;
FNanoTime:= Data^.MfileTime;
end;
constructor TWCXHeader.Create;
begin
end;
function TWCXHeader.GetDateTime: TDateTime;
begin
if FDateTime <> 0 then
Result:= FDateTime
else begin
if (FNanoTime > 0) then
FDateTime:= WinFileTimeToDateTime(FNanoTime)
else begin
if (FileTime = 0) then
FDateTime:= DATE_TIME_NULL
else begin
FDateTime:= WcxFileTimeToDateTime(FileTime);
end;
end;
Result:= FDateTime;
end;
end;
function TWCXHeader.PCharLToUTF8(CharString: PChar; MaxSize: Integer): String;
var
NameLength: Integer;
@ -903,6 +927,8 @@ begin
Result.UnpSize:= UnpSize;
Result.Cmt:= Cmt;
Result.CmtState:= CmtState;
Result.FNanoTime:= FNanoTime;
Result.FDateTime:= FDateTime;
end;
end.