Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2015
alopete alopete is offline
Miembro
 
Registrado: sep 2007
Posts: 95
Poder: 17
alopete Va por buen camino
Error al borrar carpetas

Buenas,

Trabajo con Delphi 2006 y me encuentro con este problema:

Tengo que borrar una carpeta por código con todo su contenido (he probado ya todas las funciones recursivas y demás que he encontrado en foros), pero no lo elimina hasta que cierro la aplicación. No sé si es porque se queda en la memoria o así, pero he comprobado que el current directory es C:\ para asegurarme de que no se queda en algún directorio que ya esté eliminado. El código de la función que tengo ahora es el siguiente:

Código Delphi [-]
function RemoveFolder(const Folder : string): Boolean;
var
  szFile : string;
  SearchRec: TSearchRec;
  szSearchPath : string;
  nResult : integer;
  Attributes: LongWord;
  pname: pchar;
begin
  Result := False;
  szSearchPath := Folder;
  nResult := FindFirst(szSearchPath + '\*.*', faAnyFile, SearchRec);
  try
    while nResult = 0 do
    begin
      if('.' <> SearchRec.Name[1]) then
      begin
        szFile := szSearchPath + '\' + SearchRec.Name;
        FileSetAttr(szFile, 0);
        DeleteFile(PAnsiChar(szFile));
      end;
      nResult := FindNext(SearchRec);
    end;
    Result := True;
  finally
    SysUtils.FindClose(SearchRec);
  end;
  pname := PChar(Folder);
  Attributes := GetFileAttributes(pname);
  if Attributes = $FFFFFFFF then
    raise EInOutError.Create(SysErrorMessage(GetLastError));
  if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then
    SetFileAttributes(pname, Attributes and not FILE_ATTRIBUTE_READONLY);
  Clipboard.close;
  Clipboard.Open;
  if Windows.RemoveDirectory(pname) = False then
    raise EInOutError.Create(SysErrorMessage(GetLastError)); 
end;

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 11-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
La función que presentas no es recursiva, por lo que si la carpeta tiene subcarpeta/s no funcionará.
Además de esto, si el archivo empieza por "." tampoco lo borrará. Esto puede darse en algunos casos en de aplicaciones portadas de Linux.

Te dejo a continuación tu función, corregida para ser recursiva y con los pasos comentados para aclarar qué es lo que hace en cada paso.
Verás que he borrado unas lineas que hacen referencia a Clipboard que parece que no tienen relación con el borrado de una carpeta.

Código Delphi [-]
function RemoveFolder(const Folder : string): Boolean;
var
  szFile : string;
  SearchRec: TSearchRec;
  szSearchPath : string;
  nResult : integer;
  Attributes: LongWord;
begin
  Result := False;
  szSearchPath := Folder;

  // Busco el primer archivo dentro de esa carpeta
  nResult := FindFirst(szSearchPath + '\*.*', faAnyFile, SearchRec);
  try
    // Mientras haya archivos...
    while nResult = 0 do
    begin
      // Si el archivo no es uno "especial"
      if not ((SearchRec.Name = '.') or (SearchRec.Name = '..')) then
      begin
        // Obtengo el nombra
        szFile := szSearchPath + '\' + SearchRec.Name;

        // Si es un directorio llamo recursivamente a la funcion
        if ((SearchRec.Attr and faDirectory) = faDirectory) then
           RemoveFolder(szFile)
        else
        begin
           // Si es un archivo lo borro
           FileSetAttr(szFile, 0);
           DeleteFile(PAnsiChar(szFile));
        end;
      end;

      // Busco el siguiente archivo
      nResult := FindNext(SearchRec);
    end;

    // He recorido directorio y subdirectorio correctamente borrandolos
    Result := True;
  finally
    SysUtils.FindClose(SearchRec);
  end;

  // Obtengo atributos de la carpeta
  Attributes := GetFileAttributes(PChar(Folder));

  if (Attributes = $FFFFFFFF) then
    raise EInOutError.Create(SysErrorMessage(GetLastError));

  if (Attributes and FILE_ATTRIBUTE_READONLY) <> 0 then
    SetFileAttributes(PChar(Folder), Attributes and not FILE_ATTRIBUTE_READONLY);

  // Borro la carpeta
  if Windows.RemoveDirectory(PChar(Folder)) = False then
    raise EInOutError.Create(SysErrorMessage(GetLastError));
end;

Nota:
Tengo esta estructura
Código:
  c:\Borrame\Prueba
     A.txt
     B.txt
     Subcarpeta
        C.txt
        D.txt
y lo llamo :
Código Delphi [-]
RemoveFolder('c:\Borrame\Prueba');
Responder Con Cita
  #3  
Antiguo 11-06-2015
alopete alopete is offline
Miembro
 
Registrado: sep 2007
Posts: 95
Poder: 17
alopete Va por buen camino
Hola,

Antes de nada gracias por responder tan rápido.
Lamentablemente, acabo de probarlo y me sigue dando el mismo error:

Error.jpg

He de corregir ante lo dicho, que he probado varias funciones recursivas pero al final he utilizado una que no lo sea puesto que mi estructura es como la siguiente:

Código:
C:\Borrame
     A.txt
     B.txt
     C.pdf
¿Alguna otra sugerencia?
Gracias.
Responder Con Cita
  #4  
Antiguo 11-06-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
alopete,

Cita:
Empezado por alopete
...Tengo que borrar una carpeta por código con todo su contenido...


Revisa esta información:
Espero sea útil

Nelson.
Responder Con Cita
  #5  
Antiguo 11-06-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola alopete.

Mirando en el buscador de los foros, encontré esto:
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 12-06-2015
alopete alopete is offline
Miembro
 
Registrado: sep 2007
Posts: 95
Poder: 17
alopete Va por buen camino
Buenos días,

Gracias a todos por vuestras aportaciones.

Ya he probado todo tipo de funciones para borrar la carpeta con su contenido, pero yo creo que el principal problema que tengo es que no se me elimina la carpeta hasta que no cierro la aplicación.

¿Alguna idea de por qué puede suceder?
Muchas gracias.
Responder Con Cita
  #7  
Antiguo 12-06-2015
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
Empezado por alopete Ver Mensaje
Buenos días,

Gracias a todos por vuestras aportaciones.

Ya he probado todo tipo de funciones para borrar la carpeta con su contenido, pero yo creo que el principal problema que tengo es que no se me elimina la carpeta hasta que no cierro la aplicación.

¿Alguna idea de por qué puede suceder?
Muchas gracias.
Quizás tu aplicación está en la capreta que estás borrando...
Responder Con Cita
  #8  
Antiguo 12-06-2015
alopete alopete is offline
Miembro
 
Registrado: sep 2007
Posts: 95
Poder: 17
alopete Va por buen camino
Hola,

He conseguido solventar mi problema. Al final no ha tenido nada que ver con el código: la cuestión era que tenía una pantalla donde añadía los archivos adjuntos con un componente TSheelListView que tenía puesto la propiedad AutoRefresh a True y al intentar eliminar la carpeta de esos adjuntos no me dejaba porque estaba enlazado.

Aún así, muchas gracias a todos!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Es posible compartir carpetas por Internet utilizando compartir carpetas? JuanErasmo Windows 5 12-02-2007 20:45:17
error al borrar un registro noshy SQL 1 12-05-2006 20:13:07
Borrar carpetas en delphi7 Kivan Varios 12 12-12-2005 19:26:44
Error al Borrar Una Tabla jmlifi Firebird e Interbase 2 20-04-2005 08:47:46


La franja horaria es GMT +2. Ahora son las 11:01:40.


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
Copyright 1996-2007 Club Delphi