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 -

¿Fue útil?

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}"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top