Имя пользователя:
Пароль:
 

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

Новый участник


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

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



Резервное копирование изменяемых оригинальных файлов для последующего восстановления.

Решил удалить свои старые сообщения, связать их в кучу, и прикрепить сюда (что бы не мусорить).
Здесь пытался найти ответ на:
13.06.2020 в 12:39

Хочу создать модпак, и столкнулся с такой вот идеей
Нужно что бы во время установки мода в указанную папку, и выборе модификаций, делалось backup оригинальных файлов в папку backup с bat файлом, который отправится на рабочий стол.
Допустим я выбираю Мод1 в котором файлы:
Скрытый текст

*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt


И оригинал этих файлов отправился в папку backup:
Скрытый текст

*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt


И так далее, при выборе Мод2 копия оригинала в backup...

Зачем это делать?
На рабочем столе будет создан ярлык bat файла, который при открытии будет делать замену файлов, на оригинальные файлы (которые и будут храниться в папке backup)
Или не батник, а допустим какой-то exe файл.

Не чего особо не нагуглил, что подскажите?

13.06.2020 в 19:45

Подскажите пожалуйста
Я всё же интересуюсь сделать backup файлов, которые заменяет, это так скажем "обновление"
Нашел такой вот код? Что скажите?
Скрытый текст
Код: Выделить весь код
[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs; BeforeInstall: CreateBackup

[Code
function MoveFile(const srcFile, destFile: PChar):Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
basePath:= ExpandConstant('{app}');
srcFile:= ExpandConstant(CurrentFileName);
shortPath:= srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile:= ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;

Мой код:
Скрытый текст
Код: Выделить весь код
#define AppName "Modpack"
#define AppVer "v1.0"

[Setup]
AppName={#AppName}
AppVerName=Modpack {#AppVer}
AppVersion={#AppVer}
DefaultDirName=Data

Compression=none

OutputDir=C:\Users\vladi\Desktop 
OutputBaseFilename={#AppName} {#AppVer}
InfoBeforeFile=readme.rtf                       
SetupIconFile=SetupIconFile.ico
WizardSmallImageFile=WizardSmallImageFile.bmp

DisableProgramGroupPage=yes
DisableFinishedPage=True
DisableReadyPage=True

CreateUninstallRegKey=no
Uninstallable=no

[Languages]
;Язык по умолчанию интерфейса установщика
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Messages]
SelectDirLabel3=Укажите папку с игрой

[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: bat.ico; Filename: "{app}\_backup\backup.bat"

[InstallDelete]
;Файлы\папки которые должны удалится при Установке приложения

[Types]
Name: full; Description: Полная установка; Flags: iscustom

[Components]
Name: mods; Description: Выберите модификации:;
Name: mods\pritsel; Description: Прицелы:;
Name: mods\pritsel\1; Description: Прицел CrosINC; Flags: exclusive
Name: mods\pritsel\2; Description: Прицел Дамоклов Меч; Flags: exclusive
Name: mods\pritsel\3; Description: Прицел White_v3.1; Flags: exclusive

Name: mods\angar; Description: Ангары:;
Name: mods\angar\1; Description: Ангар Brotherhood Sanctuary; Flags: exclusive
Name: mods\angar\2; Description: Ангар Hangar_WOT; Flags: exclusive
Name: mods\angar\3; Description: Ангар на карте Мираж; Flags: exclusive

[Files]
Source: C:\Mods\pritsel\crosinc\*; Components: mods\pritsel\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\damoklov-mech\*; Components: mods\pritsel\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\white\*; Components: mods\pritsel\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

Source: C:\Mods\angar\Brotherhood-Sanctuary\*; Components: mods\angar\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\Hangar_WOT\*; Components: mods\angar\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\miragg\*; Components: mods\angar\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

;Файлы, Оформление окон
Source: "VclStylesinno.dll"; DestDir: {app}; Flags: dontcopy
Source: "SmokeyQuartzKamri.vsf"; DestDir: {app}; Flags: dontcopy

;Файлы, Splash
Source: "isgsg.dll"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression
Source: "splash.png"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression

[Code
//Процедура, Оформление окон
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';

//Процедура, Splash 
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

//Функция, Оформление окон
function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('SmokeyQuartzKamri.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\SmokeyQuartzKamri.vsf'));
  Result := True;
end;
procedure DeinitializeSetup();
begin
  UnLoadVCLStyles;
end;

//Функция, Splash
procedure InitializeWizard();
begin
  ExtractTemporaryFile('splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\splash.png'),1000,3000,1000,0,255,True,$FFFFFF,10);
end;


13.06.2020 в 21:08

Есть вторая идея которую довольно реально решить.
При установке, старые файлы переименовать.
А в батнике сделать наоборот, удалять новый файл, а старый переименовать обратно.
Что думаете? Как лучше?

14.06.2020 в 10:41

Нашел такой вот код, на просторах интернета.
Помогите втулить в свой код, а то у меня ошибки, то на PChar в первом случаи, то на MoveFile во втором.

При инсталляции, в "бэкап" сохраняются (перемещением) только те файлы,которые инсталлятор заменяет.
При удалении, эти же файлы восстанавливаются (тоже перемещением).
Скрытый текст
Код: Выделить весь код
function MoveFile(const srcFile, destFile: PChar): Integer;
  external 'MoveFileA@kernel32.dll stdcall';
 
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
    RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
    RemoveDir(ExpandConstant('{app}\Install_Rus\'));
  end;
end;

Скрытый текст
Код: Выделить весь код
procedure CreateBackup;
var
  srcFile, destFile: string;
  basePath, shortPath: string;
begin
  if IsTaskSelected('src') then
  begin
    basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
    StringChangeEx(shortPath, basePath, '', True);
    destFile := ExpandConstant('{app}\Install_Rus\Backup') + shortPath;
    ForceDirectories(ExtractFilePath(destFile));
    MoveFile(PChar(srcFile), PChar(destFile));
  end;
end;


13.06.2020 в 21:08

Что-то вышло, с вот таким вот кодом:
Скрытый текст
Код: Выделить весь код
//Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
  basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
   StringChangeEx(shortPath, basePath, '', True);
   destFile := ExpandConstant('{app}\Backup') + shortPath;
 ForceDirectories(ExtractFilePath(destFile));
 MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
begin
  MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}'));
  RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;

Что думаете?
Вроде работает

Ну и я нашел ответ на этот вопрос, и решил поделится с вами:

Моя проблема решилась. Код программы работает отлично.

Для лучшего понимания как работает и для чего нужен:
Допустим вы устанавливаете модификации или обновление на программу или игру, и вам нужно что бы старые файлы сохранились, а в последующем вернулись, если что-то пойдёт не так.
(По началу я думал создать Батник для восстановления файлов, но лучшим способом всё-таки получилось через uninstall).
При установке, в корне программы/игры, создается папка "Backup", туда же помещается наш uninstall.
В итоге при удалении "обновления" старые файлы возвращаются на своё место, новые же удаляются + папка Backup удаляется.

Так как у меня вызывало ошибки на "PChar", я уже прочитав руководство, и изменил на "PAnsiChar", в SHFileOperation.iss:
Руководство: Unicode Pascal Scripting notes: The Unicode compiler sees type 'String' as a Unicode string, and 'Char' as a Unicode character. Its 'AnsiString' type hasn't changed and still is an ANSI string. Its 'PChar' type has been renamed to 'PAnsiChar'.

Для тех кто сюда зайдёт, прикладываю файл и код, может пригодится кому-то в будущем.
Код который вы будите использовать в своем коде:
Скрытый текст
Код: Выделить весь код
;Подключаем и выполняем указанный файл
#include "SHFileOperation.iss"

[Setup]
;Создание инсталлятора
Uninstallable=yes
;Куда поместить деинсталлятор
UninstallFilesDir={app}\Backup

[Messages]
;Изменение сообщений в установщике
ConfirmUninstall=Вы действительно ходите вернуть оригинальные файлы?
UninstalledAll=Оригинальные файлы восстановлены!

[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: "{app}\Backup\backup.ico"; Filename: "{app}\Backup\unins000.exe"

[Tasks]
;Если хотите, что бы спрашивалось, "Сделать Бэкап заменяемых файлов?" в установке, уберите ";" для активации функции
;Name: src; Description: Сделать Бэкап заменяемых файлов?
; + ОБЯЗАТЕЛЬНО убрать в [C0de] "//". Смотрите ниже

[_Code]
//Начало кода, Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
//begin //Для активации кнопки для Бэкапа убрать в начале begin "//". И в [Tasks] перед Name убрать ";"
//if IsTaskSelected('src') then //Для активации кнопки для Бэкапа убрать в начале if "//". И в [Tasks] перед Name убрать ";"
begin
  basePath := ExpandConstant('{app}');
    srcFile := ExpandConstant(CurrentFileName);
    shortPath := srcFile;
   StringChangeEx(shortPath, basePath, '', True);
   destFile := ExpandConstant('{app}\Backup') + shortPath; //Создание папки под названием "Backup" в программе. Те файлы которые будут ЗАМЕНЕНЫ отправятся в эту папку
 ForceDirectories(ExtractFilePath(destFile));
 MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
//end; //Для активации кнопки для Бэкапа убрать в начале end; "//". И в [Tasks] перед Name убрать ";"

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
 if CurUninstallStep = usPostUninstall then
begin
  MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}')); //От куда брать файлы при восстановлении бэкапа
  RemoveDir(ExpandConstant('{app}\Backup')); //При uninstall удалятся указанная папка Backup
end;
end;
//Конец кода, Backup

+ прилаживаю файл в архиве, который нужен для подключения: SHFileOperation.zip

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

Отправлено: 23:16, 14-06-2020 | #639