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

时间:2013-10-30 11:40:56

标签: inno-setup

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

  1. 查明是否存在两个文件(完成)
  2. 如果它们都存在,则继续安装并重写(完成)
  3. 如果两个文件都缺失,则将新文件安装/复制到目标文件夹(完成)
  4. 如果存在且另一个缺失,则获取现有文件的创建日期。创建安装缺少的文件,但将创建日期和时间设置为与现有文件完全相同(需要帮助)
  5. 我搜索了整个论坛,唯一的答案就是这个one

    请非常感谢任何帮助。

    感谢。

1 个答案:

答案 0 :(得分:1)

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

[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;

这是他们可能的用法:

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;
相关问题