Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Borrar Ficheros.Extension (https://www.clubdelphi.com/foros/showthread.php?t=23276)

serhasae 12-07-2005 19:21:33

Borrar Ficheros.Extension
 
Hola he estado mirando en el foro y he encontrado como poder borrar un fichero o como borrar una carpeta, pero quiero borrar todos los ficheros dentro de una carpeta con una extension determinada por ejemplo.
del c:\directorio\*.db

Alguna sugerencia. Gracias.

dec 12-07-2005 19:28:55

Hola,

Algo así tal vez te pueda servir:

Código Delphi [-]
procedure BorrarArchivos(dir, ext: string);
 var
   sr: TSearchRec;
 begin
   dir := IncludeTrailingPathDelimiter(dir);
   FindFirst(dir + ext, faAnyFile, sr);
   repeat
     // if FileExists(dir + sr.Name) then
     DeleteFile(dir + sr.Name);
   until FindNext(sr) <> 0;
   FindClose(sr);
 end;

serhasae 12-07-2005 19:43:51

Da error en la linea
DeleteFile(dir + sr.Name); Incompatible type String and Pchar.

cambiamos a Pchar ... deletefile (pchar(dir + sr.name))

Da error en la linea:
FindClose(sr); Incompatible type Cardinal and TSearchRec

De todas maneras creo que no esta bien enfocado del todo.

Gracias.

dec 12-07-2005 19:58:14

Hola,

El primer error se refiere a lo siguiente: arriba se usa la función "DeleteFile" sita en la unidad "SysUtils", que a su vez llama a una función del mismo nombre esta vez de la unidad "Windows". La primera requiere un parámetro de tipo "string" y la segunda de tipo "PChar".

Puedes hacer dos cosas, o esto:

Código Delphi [-]
  DeleteFile(PChar(dir + sr.Name));
... para utilizar la función de la unidad "Windows" o añadir la unidad "SysUtils" en alguna cláusula "uses". La función de la unidad "Windows" no es "multiplataforma", la de "SysUtils" sí parece serlo: tú decides, en todo caso.

Respecto del segundo error... la verdad, no sé qué decirte: a mí me funciona bien incluso en caso de no poderse borrar un determinado archivo, cosa que por otro lado se comprueba antes, e incluso estando completamente vacío el directorio que se pasa como parámetro.

Prueba a añadir la unidad "SysUtils" si no lo hiciste ya, de momento no se me ocurre otra cosa que decirte.

delphi.com.ar 12-07-2005 19:59:34

Cita:

Empezado por serhasae
Da error en la linea
DeleteFile(dir + sr.Name); Incompatible type String and Pchar.

cambiamos a Pchar ... deletefile (pchar(dir + sr.name))

Da error en la linea:
FindClose(sr); Incompatible type Cardinal and TSearchRec

De todas maneras creo que no esta bien enfocado del todo.

Gracias.

Tienes un problema con el orden en que se usan las units Windows y SysUtils. Estas funciones estan definidas en ambas, pero evidentemente te esta tomando la de Windows. Yo lo solucionaría poniendo SysUtils.FindClose (por ejemplo) como modo estricto.

Saludos!

jachguate 12-07-2005 20:04:54

Hola.

Seguramente hay un conflicto de unidades.

Según la ayuda de delphi:

Cita:

Empezado por f1
FindClose
Releases memory allocated by FindFirst.

Unit

SysUtils

Category:

file management routines

procedure FindClose(var F: TSearchRec);

Description

FindClose terminates a FindFirst/FindNext sequence.

Además, que te hace pensar que no está bien enfocado. Yo personalmente creo que no es necesaria la comprobación del FileExists, a menos que dos procesos estén borrando los archivos al mismo tiempo... pero el resto, lo veo muy bien.

Hasta luego.

;)

dec 12-07-2005 20:05:10

Hola,

Gracias Federico. Es exactamente lo que has dicho. No sabía que al cabo también el procedimiento "FindClose" de la unidad "SysUtils" acaba por llamar a uno del mismo nombre en la unidad "Windows".

Vale, pues, lo dicho más arriba, a lo que se ve, y es que si se utiliza el procedimiento "FindClose" de la unidad "SysUtils" funcionaría, según parece, también en Linux.

Gracias de nuevo Federico.

dec 12-07-2005 20:10:34

Hola,

Cita:

Empezado por jachguate
Yo personalmente creo que no es necesaria la comprobación del FileExists, a menos que dos procesos estén borrando los archivos al mismo tiempo...

Bueno. En realidad tiene un sentido ahí el "FileExists", pero, puede que no del todo correcto o equivocado. Me explico... no, no me explico.

Me explico. Cuando iba a explicarme me he dado cuenta de algo: tal vez sobre definitivamente el "FileExists" puesto que la función "DeleteFile" no causará problemas en caso de que no exista el supuesto archivo a borrar: comprobado.

La intención del "FileExists", sin embargo, era no complicar las cosas con algo así:

Código Delphi [-]
 if ((sr.Attr and faDirectory) <> 0) 
   and (sr.Name <> '.') and (sr.Name <> '..') then

... pero, definitivamente, y, como digo, pienso ahora que el "FileExists" sobra en el procedimiento. Gracias jachguate.

serhasae 12-07-2005 20:37:12

Gracias chicos, el error era de la sysutils, pero no consigo que me valla.

BorrarArchivos('c:\nuevo','.db');
LLamo a BorrarArchivos y no me borra nada dentro de la carpeta nuevo. ¿ Esta mal la extension?. Sugerencias. gracias.

dec 12-07-2005 20:45:15

Hola,

Cita:

Empezado por serhasae
Gracias chicos, el error era de la sysutils, pero no consigo que me valla.

Tuve que incluirla... El problema, creo, reside en que falta la barra invertida al final de la ruta del directorio que pasas como parámetro. Puedes asegurarte de añadirla o hacer algo así:

Código Delphi [-]
   dir := IncludeTrailingBackslash(dir);

Actualización:

Cita:

Empezado por Unidad SysUtils
IncludeTrailingBackslash is the old name for IncludeTrailingPathDelimiter.


jachguate 12-07-2005 21:15:12

Cita:

Empezado por serhasae
Gracias chicos, el error era de la sysutils, pero no consigo que me valla.

BorrarArchivos('c:\nuevo','.db');

La llamada correcta, debiera ser así:

Código Delphi [-]
BorrarArchivos('c:\nuevo\', '*.db');

serhasae 12-07-2005 21:20:38

Gracias a todos, era la barra invertida el fallo. Ya habia probado con *.extension pero como no iba iba probando. Saludos.


El Conocimiento Genera Conocimiento. Alvin Toffler.

dec 13-07-2005 12:03:06

Hola,

El procedimiento que arriba fue escrito borra los archivos haciendo uso de la función "DeleteFile", pero, siendo esto así, los archivos son borrados "definitivamente".

Tal vez sea eso lo que se pretenda, pero, mediante esta función que se halla en cierto truco de TrucoManía es posible borrar los archivos enviándolos a la papelera de reciclaje de Windows.

O sea, en este caso, tal vez se pueda elegir. Valga, esto, para cuando no se puede elegir en absoluto.

delphi.com.ar 13-07-2005 14:22:26

Aqui tienes otro juego de funciones para borrar carpetas completas, en tu caso tendrías que cambiar los filtros: Borrar un directorio con contenido

Saludos!


La franja horaria es GMT +2. Ahora son las 02:50:11.

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