Получение даты последнего изменения файла в Inno Setup Pascal Script

Мне нужно выбрать самый последний измененный файл в моем скрипте установки. Кажется, язык сценариев Паскаль не имеет 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's FormatDateTime также. Инно Паскаль имеет GetDateTimeString но это только форматирует текущее время, а не произвольное время.

2 ответа

Решение

Документация на TFindRec запись в InnoSetup находится здесь. Он очень разреженный, но я почти уверен, что он имеет тот же формат, что и соответствующая структура в Windows API.

Действительно, InnoSetup's FindFirst функция скорее всего соответствует FindFirstFile Windows API. Таким образом TFindRec запись соответствует WIN32_FIND_DATA структура так, чтобы TFileTime запись соответствует FILETIME состав.

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;
Другие вопросы по тегам