Inno setup “我怎么能?”;触摸“;InnoSetup脚本中的文件?
如何从InnoSetup(Pascal)脚本中“触摸”文件,即将其“上次修改时间”更新为当前时间?以下是触摸文件功能的代码片段:Inno setup “我怎么能?”;触摸“;InnoSetup脚本中的文件?,inno-setup,pascal,Inno Setup,Pascal,如何从InnoSetup(Pascal)脚本中“触摸”文件,即将其“上次修改时间”更新为当前时间?以下是触摸文件功能的代码片段: [Code] function CreateFile( lpFileName : String; dwDesiredAccess : Cardinal; dwShareMode : Cardinal; lpSecurityAttributes : Cardinal;
[Code]
function CreateFile(
lpFileName : String;
dwDesiredAccess : Cardinal;
dwShareMode : Cardinal;
lpSecurityAttributes : Cardinal;
dwCreationDisposition : Cardinal;
dwFlagsAndAttributes : Cardinal;
hTemplateFile : Integer
): THandle;
#ifdef UNICODE
external 'CreateFileW@kernel32.dll stdcall';
#else
external 'CreateFileA@kernel32.dll stdcall';
#endif
procedure GetSystemTimeAsFileTime(var lpSystemTimeAsFileTime: TFileTime);
external 'GetSystemTimeAsFileTime@kernel32.dll';
function SetFileModifyTime(hFile:THandle; CreationTimeNil:Cardinal; LastAccessTimeNil:Cardinal; LastWriteTime:TFileTime): BOOL;
external 'SetFileTime@kernel32.dll';
function CloseHandle(hHandle: THandle): BOOL;
external 'CloseHandle@kernel32.dll stdcall';
function TouchFile(FileName: String): Boolean;
const
{ Win32 constants }
GENERIC_WRITE = $40000000;
OPEN_EXISTING = 3;
INVALID_HANDLE_VALUE = -1;
var
FileTime: TFileTime;
FileHandle: THandle;
begin
Result := False;
FileHandle := CreateFile(FileName, GENERIC_WRITE, 0, 0, OPEN_EXISTING, $80, 0);
if FileHandle <> INVALID_HANDLE_VALUE then
try
GetSystemTimeAsFileTime(FileTime);
Result := SetFileModifyTime(FileHandle, 0, 0, FileTime);
finally
CloseHandle(FileHandle);
end;
end;
[代码]
函数CreateFile(
lpFileName:字符串;
dwDesiredAccess:红衣主教;
dwShareMode:基数;
lpSecurityAttributes:基数;
dwCreationDisposition:基数;
dwFlagsAndAttributes:基数;
hTemplateFile:Integer
):桑德尔;
#ifdef UNICODE
外部的CreateFileW@kernel32.dllstdcall';
#否则
外部的CreateFileA@kernel32.dllstdcall';
#恩迪夫
过程GetSystemTimeAsFileTime(var lpSystemTimeAsFileTime:TFileTime);
外部的GetSystemTimeAsFileTime@kernel32.dll';
函数SetFileModifyTime(hFile:THandle;CreationTimeNil:Cardinal;LastAccessTimeNil:Cardinal;LastWriteTime:TFileTime):BOOL;
外部的SetFileTime@kernel32.dll';
函数CloseHandle(hHandle:THandle):BOOL;
外部的CloseHandle@kernel32.dllstdcall';
函数TouchFile(文件名:字符串):布尔值;
常数
{Win32常量}
通用写入=40000000美元;
开放式_=3;
无效的\u句柄\u值=-1;
变量
FileTime:TFileTime;
文件句柄:THandle;
开始
结果:=假;
FileHandle:=CreateFile(文件名,一般写入,0,0,打开现有,$80,0);
如果FileHandle\u HANDLE\u值无效,则
尝试
GetSystemTimeAsFileTime(FileTime);
结果:=SetFileModifyTime(FileHandle,0,0,FileTime);
最后
CloseHandle(FileHandle);
结束;
结束;
Hi here,当我为InnoSetup创建一个CreateFile
prototype时,我找到了您的代码并对其进行了一点优化。另外,请注意,此代码适用于InnoSetup的ANSI版本。如果需要在Unicode版本中使用此选项,则应将CreateFile
函数导入定义为CreateFileW
,而不是CreateFileA
,或者使用本文中建议的技巧+1用于共享IDE;-)没错!感谢您添加了try finally。我现在已经修改了Unicode支持。