В некоторых случаях требуется удалить файлы, которые изначально не были записаны на диск пользователя во время установки. Один из таких случаев - когда у вас есть приложение, которое обновляется при запуске. Таким способом на диск можно добавлять новые файлы, которые не являются частью деинсталлятора.
Для этого случая я предлагаю вам создать файл "патча-манифеста", в котором хранятся записи о том, какие файлы должны находиться в каталоге {app}. Ниже приведен пример кода, который читает из файла в каталоге {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, а patch_manifest должен обновляться с каждым патчем. Сделайте это частью вашего процесса сборки, чтобы не забыть обновить его!
Очень важно, чтобы вы не удаляли с помощью подстановочного знака (. ), даже если вы предлагаете пользователю. У Uninstaller есть повышенные привилегии, которые могут потенциально уничтожить компьютер пользователя. Возьмите случай с пользователем, который случайно установил ваше приложение в C: \ Windows \ или C: \ Program Files.
Еще одна хорошая идея - проверить, что файл на самом деле является «вашим файлом», выполнив проверку MD5 перед его удалением. В этом случае ваш patch_manifest.txt будет включать не только относительный путь к файлу, но и контрольную сумму MD5.