Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿A alguien la ha pasado igual? (https://www.clubdelphi.com/foros/showthread.php?t=20183)

Turboleta 07-04-2005 20:25:03

¿A alguien la ha pasado igual?
 
Hola amigos. Hace tiempo que no me conectaba al foro.

Estoy haciendo un desinstalador de una aplicación. Borra todos los archivos del programa. Borra todas las entradas en el registro de windows y los enlaces en el menú Inicio. Al final mira los posibles subdirectorios, los vacía y después intenta borrarlos pero aquí aparece el problema. No puede borrarlos.
He utilizado Rmdir y RemoveDir pero da igual.
Sigo la traza con F8 y veo que se produce un error cuyo código es 32, que no aparece en la documentación de Delphi por lo que no puedo solucionarlo.
Uso Delphi 3 y los códogos de I/O error van del 100 en adelante.

¿Me pueden echar una mano? Gracias.

roman 07-04-2005 20:35:47

Cita:

Empezado por sdk de Windows
Error 32 - ERROR_SHARING_VIOLATION

The process cannot access the file because it is being used by another process.

Muy posiblemente estés tratando de borrar un archivo que aún está en uso, posiblemente el mismo desinstalador.

// Saludos

Turboleta 07-04-2005 22:48:26

En este caso no queda ningún archivo. El directorio está totalmente vacío y aparece ese error cuando intento borrarlo.
Si, una vez teminada la desinstalación, vuelvo a utilizar el desinstalador entonces ya no me da ningún error y borra todos los subdirectorios.

Román, de todas formas, investigaré por el camino que me indicas a ver si resuelvo algo. Gracias

maeyanes 07-04-2005 22:54:02

Después de borrar los archivos en una carpeta, cambia el directorio a una superior y luego trata de borrar la carpeta en cuestión.

Algo así más o menos:
Código:

  ChDir('Archivos de programa\La carpeta');
  BorrarArchivos;
  ChDir(Archivos de programa');
  BorrarCarpeta('La Carpeta')


Turboleta 07-04-2005 23:12:35

Marcos, justamente eso es lo que he hecho y no hay manera. De hecho el desinstalador está dos niveles por encima de los diretorios que quiero borrar. Le doy vueltas y más vueltas y no le encuentro el fallo.

Gracias.

roman 07-04-2005 23:17:04

¿Por qué no nos muestras un poco del código que usas, particularmente de la parte donde da el fallo?

// Saludos

pd: si escribes el código por favor usa las etiquetas [delphi] para que quede bien formado.

Turboleta 08-04-2005 00:44:31

Código:

procedure TForm1.BorrarDirectorios(Sender: TObject);
var  ListDirCol,ListDirCur:TstringList;
    ErrorBuscando, n, e:integer;
    NomDir, DirCol, DirCurs, Path, Path2: string;
    AtributArchiv: TSearchRec;
begin
  path:= StrSourceDir ;
  ListDirCol := TStringList.Create;
  ErrorBuscando:= findFirst(Path + 'coleg*',faDirectory,AtributArchiv);
  while ErrorBuscando = 0 do
    begin
      NomDir:=  extractFileName(AtributArchiv.name);
      ListDirCol.add(NomDir);
      ErrorBuscando:= findnext(AtributArchiv);
    end;

  ListDirCur := TStringList.Create;
  for n:= 0 to ListDirCol.count - 1  do
    begin
      DirCol:= ListDirCol.strings[n];      //se saca el directorio del cole
                                          // y se busca el dir del curso academico
      ErrorBuscando:= findFirst(Path +  DirCol + '\C*',faDirectory,AtributArchiv);
      while ErrorBuscando = 0 do        // ej.: C004/005
        begin
          NomDir:=  extractFileName(AtributArchiv.name);
          ListDirCur.add(NomDir);
          ErrorBuscando:= findnext(AtributArchiv);
        end;
 
      for e:= 0 to ListDirCur.count - 1 do
        begin
          DirCurs:= ListDirCur.strings[e];    // se saca del dir del curso academico
          path2:= Path +  DirCol + '\' + DirCurs + '\'; // ej.: C004005
          if DirExist(path2 + 'Cast') then
            BorraDir(path2 + 'Cast');
          if DirExist(path2 + 'Val') then
            BorraDir(Path2 +  'Val');
          ChDir(path);
          path2:= path + DirCol + '\' + DirCurs;
          BorraDir(Path2);
        end;
    end;
  FindClose(AtributArchiv);
  ListDirCol.free;          // se libera la mem utilizada x ListDirCol, ListDirCur
  ListDirCur.free;
end;


Previamente se han borrado todos los archivos del programa.

Después intenta borrar los directorios vacíos, comenzando por los de nivel más bajo.
No se produce ningún error porque los deshabilito con {$I-} pero no se borran los subdirectorios.
Los niveles de directorios son:
-Directorio del programa (en él está el desinstalador. Es el único que no se debe borrar)
-COLEG1 (Directorio hijo)
-C004005 (Dir hijo de coleg1)
-CAST, VAL (dir hijos de C004005)

Un saludo

roman 08-04-2005 03:18:04

A ver, me cuesta trabajo seguir tu código en estos momentos por lo que te voy a proponer una alternativa al método que estás usando y está en este mensaje http://www.clubdelphi.com/foros/show...84&postcount=3

// Saludos

Turboleta 08-04-2005 18:26:19

Román, la alternativa que me propones ya la había probado antes y tampoco funcionó.
Me daba un error indicando que el directorio está compartido o en uso y ni una cosa ni otra. De todas formas, gracias. Seguiré dándole vueltas hasta que encuentre la causa.
No me suelo dar por vencido fácilmente.

// Saludos.

Turboleta 10-04-2005 19:53:04

Ya está, lo encontré.
Aunque el error aparecía en el procedure mostrado anteriormente, el fallo estaba en otro procedimiento anterior en el que borraba todos los archivos de datos y del programa. Tenía un par de FindFirst sin su correspondiente FindClose.
No será que no lo había mirado veces...
Solucionado esto, el desinstalador va de categoría.


// Saludos.


La franja horaria es GMT +2. Ahora son las 02:40:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi