PDA

Ver la Versión Completa : Borrar archivos


rex
07-02-2006, 19:31:47
Hola a todos como puedo borrar varios ficheros a la vez, es decir que pueda borrar todos los ficheros que tengan la extension .tmp??

roman
07-02-2006, 19:39:34
Busca acerca de ShFileOperation

// Saludos

rex
07-02-2006, 19:45:49
gracias tambien me sirvio el 85 de trucomania

roman
07-02-2006, 20:13:59
Psee... Bonito truco que también hubieras encontrado aquí en el club (http://clubdelphi.com/vertruco.php?id=310), aunque yo prefiero éste:


var
FileInfo: TShFileOpStruct;

begin
FileInfo.Wnd := Handle;
FileInfo.wFunc := FO_DELETE;
FileInfo.pFrom := 'C:\Ruta\Con\Los\Archivos\*.cds';
FileInfo.pTo := nil;
FileInfo.fFlags := FOF_NOCONFIRMATION;

ShFileOperation(FileInfo);
end;


// Saludos

dec
07-02-2006, 21:33:58
Hola,

Bueno, Román, me gusta más el método que propones, pero, ciertamente en el truco de TrucoMania (http://www.q3.nu/trucomania/truco.cgi?85&esp) se hace uso de la recursividad... esto es, se borran los archivos contenidos en un directorio y en los subdirectorios de este. Yo he tratado de llevar a cabo algo similar haciendo uso de lo que propones, que me sigue pareciendo mejor, pero, después de unas cuantas vueltas tengo algo que, si bien parece funcionar (so pena de las revisiones que sean menester), no sé yo si termina siendo "mejor" o "peor" que el truco de TrucoMania...


uses
Windows, SysUtils, ShellApi;

function BorrarArchivos(const directorioRaiz, extension: string;
const borrarRecursivamente, podraDeshacerse: boolean) : boolean;

function Borrar(const directorios: string) : boolean;
var
opciones: Word;
operacion: TSHFileOpStruct;
begin
FillChar(operacion, SizeOf(operacion), #0);
opciones := FOF_MULTIDESTFILES or
FOF_NOCONFIRMATION or FOF_SILENT;
if (podraDeshacerse) then
opciones := opciones or FOF_ALLOWUNDO;
operacion.wFunc := FO_DELETE;
operacion.fFlags := opciones;
operacion.Wnd := GetDesktopWindow;
operacion.pFrom := PChar(directorios);
result := (ShFileOperation(operacion) = 0);
end;

var
sDirs: string;
SR: TSearchRec;
begin
result := false;
sDirs := EmptyStr;
if not DirectoryExists(directorioRaiz) then
Exit;
if borrarRecursivamente then
begin
sDirs := directorioRaiz +'\*.'+ extension +#0;
FindFirst(directorioRaiz +'\*.*', faDirectory, SR);
repeat
if ((SR.Attr and faDirectory) = faDirectory)
and (SR.Name <> '.') and (SR.Name <> '..') then
sDirs := sDirs + directorioRaiz +'\'+ SR.Name +'\*.'+ extension +#0;
until (SysUtils.FindNext(SR) <> 0);
SysUtils.FindClose(SR);
Result := Borrar(sDirs);
end
else // Borrar solo archivos del directorio raiz
Result := Borrar(directorioRaiz +'\*.'+ extension +#0);
end;

Me ha traído un poco de cabeza lo siguiente, puesto que no parece funcionar del todo bien, pero, con esos errores extraños... dice que no encuentra un determinado archivo, que no puede borrarlo, sin embargo, el archivo existe y no sé qué puede pasar. Me explico con lo de error extraño. La función anterior va bien con una carpeta y "dos o tres" subcarpetas con archivos ".tmp". Todo perfecto. Pero si son "diez o doce" carpetas nanai de la china... "No se puede borrar Archivo. No se encuentra el disco..."


function BorrarArchivos(const directorio, extension:
string; const podraDeshacerse: boolean) : boolean;

function Borrar(const dirInt: string) : boolean;
var
flags: Word;
fOp: TSHFileOpStruct;
begin
FillChar(fOp, SizeOf(fOp), #0);
flags := FOF_NOCONFIRMATION or FOF_SILENT;
with fOp do
begin
pTo := nil;
wFunc := FO_DELETE;
Wnd := GetDesktopWindow;
pFrom := PChar(dirInt+'\*.'+extension);
if (podraDeshacerse) then
flags := flags or FOF_ALLOWUNDO;
fFlags := flags;
end;
result := (ShFileOperation(fOp) = 0);
end;

var
SR: TSearchRec;
begin
Borrar(directorio);
FindFirst(directorio+'\*.*', faDirectory, SR);
repeat
if ((SR.Attr and faDirectory) = faDirectory)
and (SR.Name <> '.') and (SR.Name <> '..') then
Borrar(directorio +'\'+ SR.Name);
until (FindNext(SR) <> 0);
SysUtils.FindClose(SR);
end;


Probé con un pequeño "Delay" entre que borraba subcarpeta y subcarpeta, pero, al cabo me quedo con la primera función, que no parece tener problemas con más de 40 carpetas repletas de archivos "*.tmp" conque lo he probado. De todos modos me queda la duda de si será mejor al cabo esta función, insisto, con todos los retoques oportunos, o el truco de TrucoMania, con todos los retoques oportunos también. Bueno. No importa. Me entretuve un rato. ;)

roman
07-02-2006, 21:50:30
Caray, pues por más que leo y releo el susodicho truco, no veo donde está la recursividad, aunque en todo caso faltaría solo "un pelín" y ciertamente no sé si ShFileOperation opere recursivamente.

// Saludos

dec
07-02-2006, 22:01:40
Hola,


Caray, pues por más que leo y releo el susodicho truco, no veo donde está la recursividad, aunque en todo caso faltaría solo "un pelín" y ciertamente no sé si ShFileOperation opere recursivamente.


Bueno, es que llevas razón: el truco no opera de forma recursiva. Debí relacionar en mi cabeza ideas que no tenían nada que ver con lo que nos ocupa, acaso, y al compañero que inició el Hilo tal vez la recursividad se la trae al fresco. ;)

Por otro lado, hasta donde llego yo (y después de un par de pruebas o dos, nomás) "ShFileOperation" no opera recursivamente, salvo que se haga como lo hize en la primera función que antes copié.

Me explico, "ShFileOperation" cuenta con un campo "fFlags" que admite varios valores, como sabes. Pues bien, añadiendo el valor "FOF_MULTIDESTFILES", el campo "pFrom" de "ShFileOperation" (y también el campo "pTo", pero no lo usamos para lo que nos ocupa) admite varios caminos, varias rutas de directorios con las que vernos las caras.

Esa es la recursividad que creo soporta "ShFileOperation", en el sentido de que si te fijas en las funciones de más arriba, en realidad se hace uso de "ShFileOperation" una sola vez, salvo que indicando varias rutas de directorios y subdirectorios de los cuales queremos borrar ciertos archivos. ;)

cirilungol
08-02-2006, 09:07:11
Hay alguna manera de borrar archivos desde un pc a otro?

zeta2
08-03-2012, 22:43:34
Psee... Bonito truco que también hubieras encontrado aquí en el club (http://clubdelphi.com/vertruco.php?id=310), aunque yo prefiero éste:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)var FileInfo: TShFileOpStruct; begin FileInfo.Wnd := Handle; FileInfo.wFunc := FO_DELETE; FileInfo.pFrom := 'C:\Ruta\Con\Los\Archivos\*.cds'; FileInfo.pTo := nil; FileInfo.fFlags := FOF_NOCONFIRMATION; ShFileOperation(FileInfo); end;


// Saludos


Me salta un error al definir la variable.
TShFileOpStruct El error es el siguiente:

[Error] Unit1.pas(93): Undeclared identifier: 'TSHFileOpStruct'
[Error] Unit1.pas(96): Missing operator or semicolon
[Error] Unit1.pas(97): Missing operator or semicolon
[Error] Unit1.pas(98): Missing operator or semicolon
[Error] Unit1.pas(99): Missing operator or semicolon
[Error] Unit1.pas(100): Missing operator or semicolon
[Error] Unit1.pas(102): Undeclared identifier: 'ShFileOperation'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Este error me impide ejecutar el programa. Que puede ser?

Saludos.

ecfisa
08-03-2012, 22:50:35
Hola zeta2.

En cuanto al error "Undeclared identifier", lo solucionás agregando:

uses ShellApi;

Para los restantes ( Missing operator or semicolon (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_missing_operator_xml.html) ) tendría que ver tu código.

Saludos.