如何在Inno Setup Pascal脚本中设置现有文件的创建时间

时间:2018-03-14 01:03:58

标签: inno-setup pascalscript

FileCopy(或RenameFile)文件从目录复制到另一个目录时,原始创建时间将更改为当前日期。我想将创建时间设置为原始时间。

我可以按FindFirst获取原始时间值,但是如何在调用SetFileTime时获取要使用的文件句柄?

在Inno Setup的[Code]部分,我有这段代码:

If FileCopy(F1, F2,False) then
  If FindFirst(F1,FindRec) then
    Try
      Fhandle := ??????????? (FindRec.FindHandle don't works)
      SetFileTime(
        Fhandle, FindRec.CreationTime, FindRec.LastAccessTime, FindRec.LastWriteTime)
    finally
      FindClose(FindRec);
    end

编辑:

在Martin的回答之后我修改了代码如下(抱歉,如果远非完美...... 我是VB.NET程序员,而不是Pascal程序员):

{ C1 and C2 are full Paths }
if Not FileCopy(C1, C2, False) then
   begin
     MsgBox('Data reading error 01. Setup will be aborted.', mbError, MB_OK);
     Result := false;
     exit;
   end;

if FindFirst(C2, FindRec) then 
    try
     begin
      MyTime := FindRec.LastWriteTime //remains the original one
     end;
    finally
      FindClose(FindRec);
    end
 else
   begin
     MsgBox('Data reading error 02. Setup will be aborted.', mbError, MB_OK);
     Result := false;
     exit;
    end;
 end;  

 FileStream := TFileStream.Create(C2, fmOpenReadWrite);
 Try
    if not SetFileTime(FileStream.Handle, MyTime, MyTime, MyTime) Then
       begin
        MsgBox('Data reading error 03. Setup will be aborted.', mbError, MB_OK);
        Result := false;
        exit;
     end;
 Finally
    FileStream.Free;
 end;  

1 个答案:

答案 0 :(得分:1)

要获取文件句柄,您可以使用TFileStream class

var
  FileStream: TFileStream;
begin
  { ... }
  FileStream := TFileStream.Create(FileName, fmOpenReadWrite);
  try
    SetFileTime(FileStream.Handle, CreationTime, LastAccessTime, LastWriteTime);
  finally
    FileStream .Free;
  end;
end;

虽然@Ken写道,但在大多数情况下,使用external flag [Files]部分条目会更容易。