Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1273
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата 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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:34, 24-01-2012 | #673