¿Cómo configurar Inno Setup para desinstalar todo?
-
22-07-2019 - |
Pregunta
Soy nuevo en Inno Setup. Atascado en un problema ~ cómo configurar la pieza de desinstalación para eliminar todos los archivos, carpetas, subcarpetas e incluso nuevos archivos / carpetas, etc. creados por la aplicación (en otras palabras, una eliminación del 100% de la aplicación y los archivos asociados).
Cacé por aquí y también en su foro, y salí vacío. ¿Alguien puede señalarme un documento, preguntas frecuentes, etc. sobre cómo hacer esto?
UPDATE
Gracias por todos los comentarios hasta ahora (muy impresionante). Parece que puedo eliminar todo usando la directiva {app} *. * En la sección de desinstalación. También parece que todo el mundo está desaconsejando. Entonces, la pregunta ahora se convierte en (me pregunto si esta debería ser una pregunta totalmente nueva) ¿hay alguna forma durante la desinstalación que podamos preguntarle al usuario '¿Desea eliminar todos los archivos de proyecto asociados con esto? ¿solicitud?' y si responden SÍ, para ejecutar la desinstalación {app} *. * piece?
Gracias -
Solución
Probablemente debiste haber hecho esta pregunta totalmente nueva, pero también responderé tu pregunta actualizada aquí. Eche un vistazo a la sección " Pascal Scripting: Desinstalar código " en la Documentación de configuración de Inno.
Para dar un ejemplo de cómo eliminar condicionalmente los archivos de datos como parte del proceso de desinstalación:
[Code]
procedure DeleteBitmaps(ADirName: string);
var
FindRec: TFindRec;
begin
if FindFirst(ADirName + '\*.*', FindRec) then begin
try
repeat
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then begin
if (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin
DeleteBitmaps(ADirName + '\' + FindRec.Name);
RemoveDir(ADirName + '\' + FindRec.Name);
end;
end else if Pos('.bmp', AnsiLowerCase(FindRec.Name)) > 0 then
DeleteFile(ADirName + '\' + FindRec.Name);
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then begin
if MsgBox('Do you want to delete all data files?', mbConfirmation,
MB_YESNO) = IDYES
then begin
DeleteBitmaps(ExpandConstant('{app}'));
end;
end;
end;
Pero dependiendo de la cantidad de cosas que necesite limpiar, podría ser mejor crear un programa auxiliar especial que sea parte de la instalación y que se pueda ejecutar durante la desinstalación de la aplicación (usando una entrada en el [UninstallRun] sección).
Otros consejos
Creo que el enfoque recomendado es especificar qué eliminar en la sección de desinstalación. El razonamiento es que, si por alguna razón, el usuario decide poner sus propios archivos en su directorio de instalación que no desea eliminar, o guarda los datos que podrían querer mantener (¿tal vez desinstalar es instalar una versión más nueva? )
Dicho esto, no sé de antemano cuál es el script, pero si usa ISTool (muy recomendable) simplemente acceda a la sección Desinstalar Eliminar y agregue las cosas que desea eliminar. Debería presentar todas las opciones posibles en una buena GUI y generar el script para usted.
Editar: un ejemplo de la documentación de Inno Setup:
[UninstallDelete]
Type: files; Name: "{win}\MYPROG.INI"
Pero ellos fuertemente no haces algo como
[UninstallDelete]
Type: files; Name: "{app}\*.*"
NOTA: No tenga la tentación de usar un comodín aquí para eliminar todos los archivos en el directorio {app} Creo firmemente recomiendo no hacer esto por dos razones. Primero, los usuarios generalmente no agradecería tener sus archivos de datos ponen en el directorio de la aplicación eliminado sin previo aviso (podrían solo lo desinstalaré porque quiere moverlo a una unidad diferente, por ejemplo). Es mejor dejarlo hasta los usuarios finales para eliminar manualmente ellos si quieren. Además, si el usuario pasó a instalar el programa en el directorio equivocado por error (para ejemplo, C: \ WINDOWS) y luego fuimos a desinstalarlo podría ser desastroso Consecuencias. Así que de nuevo, ¡NO HAGAS ESTO!
Hay casos para querer eliminar archivos que no se escribieron inicialmente en el disco del usuario al momento de la instalación. Uno de estos casos es cuando tiene una aplicación que se actualiza cuando se inicia. Se pueden agregar nuevos archivos al disco de esta manera que no forman parte del desinstalador.
Para este caso le sugiero que cree un "manifiesto de parche" archivo que mantiene un registro de los archivos que deben estar en el directorio {app}. Encuentre a continuación una muestra de código que se lee desde un archivo en el directorio {app} llamado '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;
y una muestra del patch_manifest.txt
data/something_here.dat
data/moredatahere.dat
data/
Launcher.exe
patch_manifest.txt
Nota: El orden de las líneas en el patch_manifest es importante. Todos los archivos dentro de un directorio deben aparecer primero seguidos del directorio; los directorios que no están vacíos no se pueden eliminar.
Su aplicación debe enviarse con un patch_manifest y el patch_manifest debe actualizarse con cada parche. ¡Haga que esta parte de su proceso de compilación no se olvide de actualizarla!
Es muy importante que no elimine mediante comodines (. ) incluso si le solicita al usuario. Los desinstaladores tienen privilegios elevados que podrían destruir la computadora de un usuario. Tome el caso de un usuario que accidentalmente instaló su aplicación en C: \ Windows \ o C: \ Program Files.
Otra buena idea es verificar que el archivo sea de hecho " su archivo " realizando una verificación MD5 antes de eliminarlo. En este caso, su patch_manifest.txt no solo incluiría la ruta relativa al archivo sino también la suma de comprobación MD5.
No puede usar InnoSetup para desinstalar nada que no haya instalado, y no debería querer hacerlo. Por mi parte, sería muy infeliz si instalara una aplicación, ingresara una gran cantidad de datos y luego decidiera usar algo más que leería esos datos de su aplicación. Si su desinstalación mató todo el trabajo que ya había hecho, podría sentir la tentación de ir a buscarlo. Y probablemente no para comprarte una taza de café.
O considere el caso en el que instalo su aplicación en el proceso de evaluación de varios. Pruebo las aplicaciones y sigo volviendo a las tuyas porque me gusta un poco más y cada vez que ingreso más datos. Luego decido no hacer nada por un tiempo, así que elimino todas las aplicaciones de prueba. En una semana, decido que necesito usar su aplicación ahora, después de todo, y la reinstalo. ¡Uy! Todo el trabajo que hice para probarlo que ahora quería usar se ha ido.
Lo anterior es la razón por la cual, cuando desinstala una aplicación, deja todo lo que creó en las carpetas, como archivos de configuración, archivos de datos, etc. No sabe qué quiere que haga con ellos, por lo que deja ellos solos.
Esto debería hacer el truco:
[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
¿No es ese el valor predeterminado si no especifica " uninsneveruninstall " para una entrada?
editar - Lo siento, no me había dado cuenta de que estabas hablando de archivos de datos recién creados.
Quería eliminar gData.dat
que se creó en tiempo de ejecución en la carpeta instalada
y estaba funcionando bien para mí
[UninstallDelete]
Type: files; Name: "{app}\gData.dat"
Agregue el elemento de eliminación de archivo / carpeta en Inno Setup studio. O utilice directamente el script de la siguiente manera.
[Muestra de código generado]
[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"
Para eliminar todo lo que uso esto:
[UninstallDelete]
Type:files; Name: "{app}"