Цитата sancheolz:
А надо бы сравнить даты изменения. Покопавшись немного решил, что можно сравнить даты штатными средствами windows через вызов bat или своей проги какой-нить. И поэтому возникла проблема как "достучаться" до файла в пакете. »
|
sancheolz, это сложная задача, т.к. "достучаться" до файла нужно на этапе препроцессинга (парсить строки секции Files, выдирать значение Source с учетом директивы SourceDir, масок, флагов типа external). Предлагаю функцию, где параметр - дата изменения файла-источника в формате YYYYMMDD. Разумеется, маски недопустимы. Файл будет установлен, если либо его нет в папке назначения, либо он есть, но дата изменения старше.
Код:

[Files]
Source: test.txt; DestDir: {app}; Check: IsLastWriteTimeAttributeChanged('20110127')
[code]
type
FILETIME = record
dwLowDateTime, dwHighDateTime: DWORD;
end;
WIN32_FILE_ATTRIBUTE_DATA = record
dwFileAttributes: DWORD;
ftCreationTime, ftLastAccessTime, ftLastWriteTime: FILETIME;
nFileSizeHigh, nFileSizeLow: DWORD;
end;
SYSTEMTIME = record
wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: WORD;
end;
function GetFileAttributesEx(lpFileName: String; fInfoLevelId: DWORD; var lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA): BOOL; external 'GetFileAttributesExA@kernel32.dll stdcall';
function FileTimeToSystemTime(const lpFileTime: FILETIME; var lpSystemTime: SYSTEMTIME): BOOL; external 'FileTimeToSystemTime@kernel32.dll stdcall';
function IsLastWriteTimeAttributeChanged(Param: String): Boolean; //Param have YYYYMMDD format
var
lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA;
lpSystemTime: SYSTEMTIME;
begin
if FileExists(ExpandConstant(CurrentFileName)) then
begin
GetFileAttributesEx(ExpandConstant(CurrentFileName), $0, lpFileInformation);
FileTimeToSystemTime(lpFileInformation.ftLastWriteTime, lpSystemTime);
Result := Format('%.4d%.2d%.2d', [lpSystemTime.wYear, lpSystemTime.wMonth, lpSystemTime.wDay]) > Param;
end else Result := True;
end;