Ветеран
Сообщения: 649
Благодарности: 444
|
Профиль
|
Отправить PM
| Цитировать
Leka_651,
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста
но его нет поэтому сделал свой вариант бэкапа
в нём устранены все дисфункции твоей системы резервного коприрования (по функционалу)
======================================
вот (приписал несколько комментариев) :
читать дальше »
Код: 
#define JINNEE_DIR "JINNEE_DIR"
#define CLIENT_DIR "CLIENT_DIR"
[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none
[Files]
Source: My_CLIENT_DIR\*; DestDir: {app}\{#CLIENT_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: My_JINNEE_DIR\*; DestDir: {app}\{#JINNEE_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
[code]
type
TSHFileOpStruct=record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;
function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';
function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
F:TShFileOpStruct;
a1,a2:string;
begin
F.Wnd:=0;
if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
a1:=FromFile+#0#0;
F.pFrom:=PChar(a1);
a2:=AddBackslash(ToDir)+#0#0;
F.pTo:=PChar(a2);
F.fFlags:=$0254;
Result:=(ShFileOperation(F)=0);
end;
procedure BackupDir(const FromDir,ToDir,FileMask :string; IsRemove,IncludeSubDirs: boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: // этап установки /// перед установкой
begin
if (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}'))) and /// если эти папки существуют в директории установки
not (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\DLL_BACKUP'))) then /// а эти с бэкапом нет, то
begin
with WizardForm do
begin
StatusLabel.Caption := 'Резервное копирование папки {#CLIENT_DIR}'; /// в лейбл статуса пишем "резервное копирование..."
CancelButton.Enabled := False; /// для кравоты и не только блокируем кнопку "Отмена"
ProgressGauge.Visible := CancelButton.Enabled; /// и делаем прогрессбар невидимым
/// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) then BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}'),ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),'*.*',False,True);
/// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}')) then BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}'),ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),'*.*',False,True);
/// копируем библиотеки по маске*(расширению) в папку DLL_BACKUP
BackupDir(ExpandConstant('{app}'),ExpandConstant('{app}\DLL_BACKUP'),'*.dll',False,True);
CancelButton.Enabled := True; /// делаем кнопку "Отмена" активной
ProgressGauge.Visible := CancelButton.Enabled; /// ну и зависмсость прогресбара от состояния кнопки, те видимым
end;
end;
end;
end;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
begin
case CurPageID of /// если ай-ди страницы...
wpInstalling: ///...страница установки
begin
case ExitSetupMsgBox of
True:
begin
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then /// если существуют файлы бэкапа
begin
Confirm := False; /// убираем подтверэдение
with WizardForm do
begin
StatusLabel.Caption := SetupMessage(msgStatusRollback); // в статул лейбл пишем "Откат..."
CancelButton.Enabled := False; /// для красоты блокируем кнопку "Отмена"
ProgressGauge.Visible := CancelButton.Enabled; /// прячем прогресбар
FilenameLabel.Hide; /// прячем застывший лейбл отображающий какой файл только что распаковывался
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
begin
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку CLIENT_DIR
BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
end;
if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
begin
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
end;
if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
begin
BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
end;
end;
Cancel := True; /// выходим из инсталла
end;
end;
False: Cancel := False;
end;
end;
end;
end;
Цитата Leka_651:
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен. »
|
[UninstallDelete]
Type: filesandordirs; Name: not "{app}\db"
если нужно откатывать бэкап при удалении, то вот функция
читать дальше »
Код: 
#define MyAppName "DisksInfo"
...
function InitializeUninstall(): Boolean;
var
Errorcode: Integer;
begin
Result := False;
if not UninstallSilent then
begin
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
Exit;
end;
if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
begin
if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
begin
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку CLIENT_DIR
BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
end;
if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
begin
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
end;
if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
begin
BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
end;
Result := True;
MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
end
else Result := False;
end;
пользуйся!
Разве установка должна отменяться без подтверждения ("Вы уверены...")?
|