Ветеран
Сообщения: 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