Inno setup “我怎么能?”;触摸“;InnoSetup脚本中的文件?

Inno setup “我怎么能?”;触摸“;InnoSetup脚本中的文件?,inno-setup,pascal,Inno Setup,Pascal,如何从InnoSetup(Pascal)脚本中“触摸”文件,即将其“上次修改时间”更新为当前时间?以下是触摸文件功能的代码片段: [Code] function CreateFile( lpFileName : String; dwDesiredAccess : Cardinal; dwShareMode : Cardinal; lpSecurityAttributes : Cardinal;

如何从InnoSetup(Pascal)脚本中“触摸”文件,即将其“上次修改时间”更新为当前时间?

以下是触摸文件功能的代码片段:

[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支持。