【问题标题】:Getting the last modification date of a file in Inno Setup Pascal Script在 Inno Setup Pascal 脚本中获取文件的最后修改日期
【发布时间】:2011-08-13 10:45:41
【问题描述】:

我需要在我的安装脚本中选择最近修改的文件。看来 Pascal 脚本语言没有 GetFileDateTime 或类似的,所以我求助于:

function FileDateTime (FileID : string) : double ;

var
   FindRec        : TFindRec;

begin
    Result := 0.00 ;
    if (FindFirst (FileID, FindRec)) then
        begin
        try
            Result := FindRec.LastWriteTime ;  { gives type mismatch, naturally }
        finally
            FindClose (FindRec) ;
        end ;
    end ;
end ;

但我找不到任何关于LastWriteTime 格式的文档。理想情况下,我希望以一种相对容易显示的格式返回日期时间,因为我还需要编写与 Delphi 的 FormatDateTime 等效的内容。 Inno Pascal 有 GetDateTimeString 但这只会格式化当前日期时间,而不是任意日期时间。

【问题讨论】:

  • 我不认为 Pascal 可以被描述为一种“脚本语言”
  • @pavium - 不,但作者​​选择这样做。来自 InnoSetup 网页:“Inno Setup 4 引入了 Pascal 脚本功能。”
  • 好吧,如果它可以重生为脚本语言,我会很高兴。我仍在使用一种特殊形式的 Pascal。就是这样 - 没有两个版本的 Pascal 是相同的。
  • @pavium:有不同的pascal脚本实现,例如来自rem对象的Pascal Script,我认为这是Jordan在Inno Script中使用的(不确定)。
  • 我的立场是正确的。我在考虑几十年前在 HP300 系列计算机上使用的“帕斯卡”,现在仍然在 HP/Apollo 工作站上使用。所以关于帕斯卡死亡的报道被大大夸大了。

标签: datetime scripting inno-setup pascal datestamp


【解决方案1】:

关于 InnoSetup 中 TFindRec 记录的文档是 here。它非常稀疏,但我几乎确信它与 Windows API 中的相应结构具有完全相同的格式。

确实,InnoSetup 的 FindFirst 函数很可能对应于 Windows API 的 FindFirstFile。因此,TFindRec 记录对应于WIN32_FIND_DATA 结构,因此TFileTime 记录对应于FILETIME 结构。

【讨论】:

【解决方案2】:
type  
SYSTEMTIME = record 
  Year:         WORD; 
  Month:        WORD; 
  DayOfWeek:    WORD; 
  Day:          WORD; 
  Hour:         WORD; 
  Minute:       WORD; 
  Second:       WORD; 
  Milliseconds: WORD; 
end; 


function FileTimeToSystemTime(
FileTime:        TFileTime; 
var SystemTime:  SYSTEMTIME
): Boolean; 
external 'FileTimeToSystemTime@kernel32.dll stdcall'; 


function GetModifiedFileDate(strFile : String) : Boolean;
var 
   FindRec: TFindRec;  
   SystemInfo: SYSTEMTIME;  
begin 
   if FindFirst(strFile, FindRec) then begin
      FileTimeToSystemTime( FindRec.LastWriteTime, SystemInfo);  
end;  
MsgBox(format('%4.4d-%2.2d-%2.2d', [SystemInfo.Year, SystemInfo.Month, SystemInfo.Day]), mbInformation, MB_OK);
end;

【讨论】:

  • 不错。但是你能修改GetModifiedFileDate 使它的签名有意义吗?这是一个返回Boolean 的函数,但它不返回任何内容。
猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多