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

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

Ветеран


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

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


Цитата _Akim_:
Ребят помогите, что то никак не могу найти пример кода. Нужно чтоб при установке создавался бэкап папки (копированием) а при повторном запуске инсталятора проверялось бы наличие этой бэкап папки, и если она есть то повторно не бэкапить. »
Пример
Код: Выделить весь код
#define CUR_DIR "main" ;Глобально: папка, откуда копируем.
#define BAK_DIR "_backup" ;Глобально: папка, куда копируем.

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\main; Flags: external overwritereadonly ignoreversion;


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';


var
    backupChk: TCheckBox;


procedure IsBackup(const FromDir: String; const ToDir: String);
var
    fileArray: array of String;
    FindFiles: TFindRec;
    i, Len: Integer;
begin
    fileArray := ['*'];
    Len := GetArrayLength(fileArray) - 1;
    for i := 0 to Len do
    begin
        if FindFirst(FromDir + fileArray[i], FindFiles) then
        try
            WizardForm.ProgressGauge.Hide;
            WizardForm.StatusLabel.Caption := 'Создание резервной копии файлов...';

            repeat
                if not DirExists(ToDir) then CreateDir(ToDir);
                  CopyFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name, False);
            until not FindNext(FindFiles);
        finally

            WizardForm.ProgressGauge.Show;
            FindClose(FindFiles);
        end;
    end;
end;


procedure InitializeWizard();
var
    ThereIsFolders: Boolean;
begin
    backupChk := nil;
    ThereIsFolders := (DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}') and //Проверяем, есть ли папка, откуда копируем файлы.
                      (not DirExists(AddBackslash(WizardDirValue()) + '{#BAK_DIR}')) ); //Проверяем, что папка, куда копируем файлы не существует.

    if ThereIsFolders then //Если оба вышеозначенных условия соблюдены создаем чекбокс.
    begin
        backupChk := TCheckBox.Create(nil);
        with backupChk do
        begin
            Parent := WizardForm.SelectDirPage;
            SetBounds(ScaleX(WizardForm.DirEdit.Left), ScaleY(WizardForm.DiskSpaceLabel.Top div 2), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
            Caption := 'Сохранить резервную копию перезаписываемых файлов';
            Checked := ThereIsFolders;
        end;
    end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssInstall: if backupChk <> nil then //Проверяем, создан ли чекбокс.
                     if backupChk.Checked then //Если чекбокс создан, проверяем отмечен ли он
                       //Вызываем процедуру создания резервной копии файлов нв этапе перед установкой.
                       IsBackup(ExpandConstant('{app}\{#CUR_DIR}\'), //Папка, откуда копируем файлы.
                       ExpandConstant('{app}\{#BAK_DIR}\')); //Папка, куда копируем файлы.
    end;
end;
Имейте ввиду, что удовлетворительным результатом здесь является исключительно отсутствие папки. Если папка есть, но она пуста, все равно будет возвращен False результат.

---------------------------------------------------------------

habib2302
Код: Выделить весь код
[Setup]
CreateUninstallRegKey=_CheckIsComponents

[Code]
function _CheckIsComponents(): Boolean;
begin
    Result := not IsComponentSelected('AIDA64\Portable\1') and
    not IsComponentSelected('AIDA64\Portable\2') and
    not IsComponentSelected('AIDA64\Portable\3');
end;
Цитата habib2302:
CreateUninstallRegKey=not IsComponentSelected('AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua') »
IsComponentSelected('...'): здесь должно быть указано имя компонента, одного, а не всех компонентов разом, да еще и языков зачем-то. В итоге для компилятора это строка считается именем одного компонента, вот он и проверяет, отмечен ли компонент под именем AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua

Последний раз редактировалось saurn, 11-02-2014 в 10:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:03, 11-02-2014 | #2242