Inno setup 从一个文件中读取创建日期/时间,并使用它设置另一个文件的创建日期

Inno setup 从一个文件中读取创建日期/时间,并使用它设置另一个文件的创建日期,inno-setup,Inno Setup,我有一个Inno安装脚本,运行良好,但我需要在其中加入一个功能。我希望在任何安装过程中实现以下目标: 找出是否存在两个文件(完成) 如果它们都存在,则继续安装,并对它们进行过写(完成) 如果两个文件都丢失,则将新文件安装/复制到目标文件夹(完成) 如果一个存在,另一个丢失,则获取现有文件的创建日期。创建并安装缺少的文件,但将创建日期和时间设置为与现有文件完全相同(需要此方面的帮助) 我搜索了整个论坛,cam唯一接近的答案就是这个 任何帮助都将不胜感激 谢谢。以下是一组可以获取和设置文件时间的函数

我有一个Inno安装脚本,运行良好,但我需要在其中加入一个功能。我希望在任何安装过程中实现以下目标:

  • 找出是否存在两个文件(完成)
  • 如果它们都存在,则继续安装,并对它们进行过写(完成)
  • 如果两个文件都丢失,则将新文件安装/复制到目标文件夹(完成)
  • 如果一个存在,另一个丢失,则获取现有文件的创建日期。创建并安装缺少的文件,但将创建日期和时间设置为与现有文件完全相同(需要此方面的帮助)
  • 我搜索了整个论坛,cam唯一接近的答案就是这个

    任何帮助都将不胜感激


    谢谢。

    以下是一组可以获取和设置文件时间的函数:

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    OutputDir=userdocs:Inno Setup Examples Output
    
    [Code]
    #ifdef UNICODE
      #define AW "W"
    #else
      #define AW "A"
    #endif
    
    const
      OPEN_EXISTING = 3;  
      GENERIC_READ = $80000000;
      FILE_WRITE_ATTRIBUTES = $0100;
      INVALID_HANDLE_VALUE = 4294967295;
    
    type
      TFileTimes = record
        CreationTime: TFileTime;
        LastWriteTime: TFileTime;
        LastAccessTime: TFileTime;
      end;
    
    function CreateFile(lpFileName: string; dwDesiredAccess, dwShareMode,
      lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes: DWORD;
      hTemplateFile: THandle): THandle; 
      external 'CreateFile{#AW}@kernel32.dll stdcall';
    function CloseHandle(hObject: THandle): BOOL; 
      external 'CloseHandle@kernel32.dll stdcall';
    function GetFileTime(hFile: THandle; out lpCreationTime, lpLastAccessTime,
      lpLastWriteTime: TFileTime): BOOL;
      external 'GetFileTime@kernel32.dll stdcall';
    function SetFileTime(hFile: THandle; const lpCreationTime, lpLastAccessTime, 
      lpLastWriteTime: TFileTime): BOOL; 
      external 'SetFileTime@kernel32.dll stdcall';
    
    function TryGetFileTimes(const FileName: string; out FileTimes: TFileTimes): Boolean;
    var
      FileHandle: THandle;
      CreationTime: TFileTime;
      LastWriteTime: TFileTime;
      LastAccessTime: TFileTime;
    begin
      Result := False;
    
      FileHandle := CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);
      if FileHandle <> INVALID_HANDLE_VALUE then
      try
        Result := Boolean(GetFileTime(FileHandle, CreationTime, LastAccessTime, 
          LastWriteTime));
        if Result then
        begin
          FileTimes.CreationTime := CreationTime;
          FileTimes.LastWriteTime := LastWriteTime;
          FileTimes.LastAccessTime := LastAccessTime;
        end;
      finally
        CloseHandle(FileHandle);
      end;
    end;
    
    function SetFileTimes(const FileName: string; const FileTimes: TFileTimes): Boolean;
    var
      FileHandle: THandle;
    begin
      Result := False;
    
      FileHandle := CreateFile(FileName, FILE_WRITE_ATTRIBUTES, 0, 0, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, 0);
      if FileHandle <> INVALID_HANDLE_VALUE then
      try
        Result := Boolean(SetFileTime(FileHandle, FileTimes.CreationTime,
          FileTimes.LastAccessTime, FileTimes.LastWriteTime));
      finally
        CloseHandle(FileHandle);
      end;
    end;
    

    我只想对你在这件事上的帮助说声谢谢。自从我发布问题后,我一直没有空。请你能给我解释一下吗<代码>如果FileCopy('C:\TheNewFile.xxx','C:\TheFile.xxx',False),则设置FileTimes('C:\TheFile.xxx',FileTimes)是否尝试复制newfile.xxx并另存为file.xxx?从帮助文件中,由于C:\TheFile.xxx已经存在,FileCopy的计算结果将为False。但是我们是否应该设置C:\TheFile.xxx或C:\TheNewFile.xxx的文件时间,如
    SetFileTimes('C:\TheFile.xxx',FileTimes)中所示请帮助我澄清逻辑。代码应使用
    newfile.xxx
    覆盖
    TheFile.xxx
    文件,并设置为覆盖之前的
    TheFile.xxx
    文件时间。谢谢。我现在明白了,我真的很感谢你的帮助。
    var
      FileTimes: TFileTimes;
    begin
      if TryGetFileTimes('C:\TheFile.xxx', FileTimes) then
      begin
        if FileCopy('C:\TheNewFile.xxx', 'C:\TheFile.xxx', False) then
          SetFileTimes('C:\TheFile.xxx', FileTimes);
      end;
    end;