mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: Wcx-plugins - more accurate time support
This commit is contained in:
parent
573515e601
commit
1b9671eda7
9 changed files with 49 additions and 24 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -132,6 +132,7 @@ typedef struct {
|
|||
int CmtSize;
|
||||
int CmtState;
|
||||
char Reserved[1024];
|
||||
uint64_t MfileTime;
|
||||
} tHeaderDataExW;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@ type
|
|||
CmtSize,
|
||||
CmtState:longint;
|
||||
Reserved:array[0..1023] of char;
|
||||
MfileTime: UInt64;
|
||||
end;
|
||||
|
||||
tOpenArchiveData=packed record
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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, '',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue