Есть случаи, когда необходимо удалить файлы, которые изначально не были записаны на диск пользователя во время установки. Один из этих случаев - это когда у вас есть приложение, которое обновляет себя, когда оно запущено. Новые файлы могут быть добавлены на диск таким образом, которые не являются частью деинсталлятора.
Для этого случая я предлагаю создать файл «патч-манифест», который хранит текущую запись о том, какие файлы должны находиться в каталоге {app}. Ниже вы найдете образец кода, который считывает данные из файла в {приложение} директории под названием «patch_manifest.txt»
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
i: Integer;
arrayLen: Longint;
item: String;
itemsToDelete: Array of String;
begin
case CurUninstallStep of
usUninstall:
begin
LoadStringsFromFile(ExpandConstant('{app}') + '\patch_manifest.txt', itemsToDelete);
arrayLen := GetArrayLength(itemsToDelete);
for i := 0 to arrayLen-1 do
begin
item := ExpandConstant('{app}') + '\' + itemsToDelete[i];
if FileExists(item) then
DeleteFile(item);
if DirExists(item) then
RemoveDir(item);
end;
end;
end;
end;
и образец patch_manifest.txt
data/something_here.dat
data/moredatahere.dat
data/
Launcher.exe
patch_manifest.txt
Примечание: Порядок строки в patch_manifest важны. Сначала должны быть указаны все файлы в каталоге, за которыми следует каталог - каталоги, которые не являются пустыми, не могут быть удалены.
Ваше приложение должно быть отправлено с патч-манифестом, а patch_manifest должен обновляться с каждым патчем. Сделайте эту часть процесса сборки, чтобы вы не забыли ее обновить!
Очень важно, чтобы вы не удаляли по шаблону (.), даже если вы запрашиваете у пользователя. У Uninstaller есть повышенные привилегии, которые могут потенциально уничтожить компьютер пользователя. Возьмите случай пользователя, который случайно установил ваше приложение в C: \ Windows \ или C: \ Program Files.
Еще одна хорошая идея - убедиться, что файл фактически является «вашим файлом», выполнив проверку MD5 перед его удалением. В этом случае ваш patch_manifest.txt будет содержать не только относительный путь к файлу, но и контрольную сумму MD5.
Я думаю, что причина, по которой это обычно не возникает, заключается в том, что хорошо выполненное приложение не хранит созданный пользователем контент в своей папке {app}. В рамках модели наименее доступного пользователя фактический пользователь, как правило, не сможет писать там в любом случае. Вот почему папка Application Data существует. – RBerteig
У меня проблема с обновлением моего продукта, который может добавлять новые файлы. Это файлы продуктов, а не файлы данных. Их действительно нужно удалить вместе с продуктом, но во время установки эти файлы были неизвестны. Таким образом, есть законная причина для удаления файлов во время удаления, которые не были установлены там во время установки. – Charles
Если у вас есть случай обновления, обновление должно быть выполнено обновленным установщиком Inno. Таким образом, он автоматически добавит новые файлы, которые будут удалены, и вам не нужно делать ничего особенного. (Помните, что приложение работает как не-админ, а для установки и обновления требуются разрешения администратора, поэтому приложение не может обновить себя, не запуская отдельного установщика с повышенными правами.) – Miral