Inno setup 从一个文件中读取创建日期/时间,并使用它设置另一个文件的创建日期
我有一个Inno安装脚本,运行良好,但我需要在其中加入一个功能。我希望在任何安装过程中实现以下目标:Inno setup 从一个文件中读取创建日期/时间,并使用它设置另一个文件的创建日期,inno-setup,Inno Setup,我有一个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;