Delphi - DIRECTORIOS

 
Vista:

DIRECTORIOS

Publicado por Mariano (46 intervenciones) el 17/11/2007 01:11:13
Hola a tod@s:
Estoy desarrollando una aplicación que debe crear una carpeta temporal en C:\ (debe detectar si ya existe la carpeta) y al finalizar la aplicación debe eliminarla.

He encontrado los procedimientos
procedure ForceDirectories(Dir: string);
function DirectoryExists(Name: string): Boolean;

pero no encuentro ninguno que pueda eliminar el directorio (independientemente que esté lleno o vacío).
¿Podrían ayudarme?

Muchas gracias de antemano por su ayuda.
Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:DIRECTORIOS

Publicado por emilio (175 intervenciones) el 17/11/2007 23:33:01
MMMMMMMMMM, los iniciados....

begin
if DirectoriesExsists(aDir) then
begin
AdicionarCosas; // un metodo que añada tus cosas al directorio pues, ya exsiste.
end
else
begin
MkDir(aDir); //Crear el directorio.
AdicionarCosas;
end;
end;

Para borrar un directorio primero debes borrar todo lo que hay dentro del... eso te lo dejo de tarea para la casa.

Usa FindFristFile y FindNext para buscar Archivos y directorios dentro de un directorio, DeleteFile y DeleteDirectory para elimar los archivos y Directorios.

Otra pista.... Usa Threads o una llamada a Application.Processmessage; para que no se bloquee la aplicacion. SUERTE!!!!!

Ahhh... se me olvidaba, si los archivos son de solo lectura DeleteFile falla devolviendo False. eso es para que no te vuelvas loco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por Mariano (46 intervenciones) el 18/11/2007 21:04:11
Hola Emilio:
Muchas gracias por tu ayuda.
He podido eliminar todos los archivos que se encuentran dentro del directorio deseado.
Sin embargo, no puedo borrar el directorio.

Utilizo el compilador de Borland Delphi 4. He buscado en la ayuda y he encontrado dos metodos alternativos:
RMDir('C:\TempX\');
RemoveDir('C:\TempX');

Con ninguno de los dos consigo borrar el directorio.
He probado a cambiar el string por 'C:\tempX\' (con la barra final y sin la barra final).
Creo que he probado todas las combinaciones.
Nada. No puedo.

¿Tiene que ver algo la version que utilizo?
Muchas gracias de nuevo.
Tu ayuda me ha sido de gran utilidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por emilio (175 intervenciones) el 19/11/2007 13:58:37
mmmmmmmmmm.... Mira, nunca he intentado eliminar un directorio pues hasta ahora no he tenido que hacer eso en mis desarrollos, pero si la experiencia no me engaña eso es problemas de atributos del directorio o que tienes un handle habierto; asegurate que todos los handle de ese directorio esten liberados(Cuando realizas la busqueda de los archivos dentro del directorio para eliminarlo estas habriendo un handle a ese directorio asi que cerciorate de cerrarlo y de que este vacio antes de intentar eliminarlo). RMDir y RemuverDir son la misma cosa, una llamada el API de windows, asi que Delphi no tiene nada que ver en esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por Mariano (46 intervenciones) el 19/11/2007 19:51:11
Fiuuuuu...!!!
Eso queda muy lejos de mis conocimientos.
Voy a intentar echar un vistazo el tema de los Manejadores...
A ver si soy capaz.

Tambien he intentado hacerlo de la siguiente forma:
Como un directorio es un tipo especial de archivo, he intentado eliminarlo, buscandolo desde el directorio raiz, a traves de FINDFIRST y FINDNEXT, utilizando el parametro "faDirectory".
Lo encuentra, pero al utilizar DeleteFile no lo elimina tampoco.

una ultima pregunta, para no ser demasiado pesado con el tema: Ese handle, ¿en qué parte del registro queda?
No estoy nada habituado al uso de handles, he mirado algo pero, para realizar una operación en teoría tan sencilla...

Saludos cordiales y muchas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por emilio (175 intervenciones) el 20/11/2007 14:03:43
Un handle es lo que utiliza windows para manejar los recursos, osea cada ves que le pides un recurso a windows este te devuelve un Handle(un manejador de ese recurso), por lo tanto el programador nunca trabaja con el recurso en si, eso lo hace windows para protegerse y poder compartir el recurso entre varios solicitadores.

FindFirst y FindNext lo que hacen es eso, obtener handles a los recursos(Carpetas, Archivos, etc.) asi que cuantos archivos busques con esas funciones sera la cantidad de handles que tienes abierto, por eso es debes usar CloseHandle para liberar esos handles(se me habia olvidado comentarte ese metodo).

Mira no se cual fue el algorirmo que utilizastes para hacer las busquedas asi que si quieres lo pones por aca para hecharle un vistazo, de antemano te puedo decir que ese es tu proble(los handles :D ).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por kapullok_2006 (1 intervención) el 21/11/2007 17:03:54
Hola,he probado trucos y no consigo nada,pues las funciones
que usan en el borrado de directorios,no las encuentra mi delphi 6.
Mi problema está este código:

Código Delphi [-]

procedure TForm1.BitBtn1Click(Sender: TObject);
var
directorio_medio2,directorio_fecha:string;
DirInfo: TSearchRec;
r : Integer;

begin

r := FindFirst('C:\MEDIOS\MEDIO2\*.*', FaAnyfile, DirInfo);
while r = 0 do begin
if ((DirInfo.Attr and FaDirectory <> FaDirectory) and
(DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
if DeleteFile(pChar('C:\MEDIOS\MEDIO2\' + DirInfo.Name))
= false then
{Si no puede borrar el fichero}
ShowMessage('Unable to delete : C:\MEDIOS\MEDIO2\' +
DirInfo.Name);
r := FindNext(DirInfo);
end;
SysUtils.FindClose(DirInfo);
//AQUI FALLA,NO BORRA DIRECTORIO MEDIOS
if RemoveDir('C:\MEDIOS\MEDIO2\') = false then

{Si no puedes borrar el directorio}
ShowMessage('Unable to delete dirctory : C:\MEDIOS\MEDIO2');




directorio_medio2:='C:\MEDIOS\MEDIO2\';
directorio_fecha:=IntToStr(Trunc(Now*24*3600*60));
//C:\MEDIOS\MEDIO2\4234232
directorio_medio2:=directorio_medio2+directorio_fecha;

//Crea la ruta anterior
ForceDirectories(directorio_medio2);

//traspasa el fichero de un lado para otro
//Obtendría por Ejemplo:C:\MEDIOS\MEDIO2\4234232\foto_a_imprimir.bmp CopyFile(PChar('C:\FOTO_PARA_IMPRIMIR\foto_a_imprimir.bmp'),PChar(directorio_medio2+'\'+'foto_a_impr imir.bmp'),false);

end;

Quiero que cada vez que pincho un boton,me lo borre entero,incluido sus
subdirectorios y archivos.
El problema es que no borra C:\MEDIOS,por lo que me crea el directorio_fecha con el fichero bmp en C:\MEDIOS\MEDIO2, cada vez que pincho boton.

¿ALguna opcion,que funcione para este ejemplo?
Estoy desesperado.Espero que me sujiráis algo.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

TU SALVACION!!!

Publicado por emilio (175 intervenciones) el 22/11/2007 14:53:34
Alguna ves has escuchado la frase: "Divide y venceras" , pues creo que deberias buscar a alguien que te la diga si no la has oido :). Vamos por partes si, vamos a hacer algo para extraer todos los recursos de un directorio.

TFindFiles = class(TObject)
private
FFileList : TStrings;
function GetFilesCount: Integer;

protected
procedure FillFileList(var Dir : string);

public
property FileList : TStrings read FFileList;
property FilesCount : Integer read GetFilesCount;
function Execute(Location : string) : Boolean;
constructor Create;
destructor Destroy; override;
end;

Implementation

{ TFindFiles }

constructor TFindFiles.Create;
begin
FFileList := TStringList.Create;
end;

destructor TFindFiles.Destroy;
begin
FFileList.Free;
inherited;
end;

function TFindFiles.Execute(Location: string): Boolean;
begin
Result := DirectoryExists(Location);

if Result then
begin
FFileList.Clear;
FillFileList(Location);
end;

end;

procedure TFindFiles.FillFileList(var Dir: string);
var
FSearchRect : TSearchRec;
P : Smallint;
begin
if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';

if FindFirst(Dir + '*.*',faDirectory,FSearchRect ) = 0 then
repeat
Application.ProcessMessages;

case FSearchRect.Attr of
faArchive: FFileList.Add(Dir + FSearchRect.Name);

faDirectory: if (FSearchRect.Name <> '.') and (FSearchRect.Name <> '..') then
begin
Dir := Dir + FSearchRect.Name + '\';
FillFileList(Dir);
end;

else if (FSearchRect.Name <> '.') and (FSearchRect.Name <> '..') then
if (FSearchRect.Attr <> faDirectory) and (DirectoryExists(Dir + FSearchRect.Name)) then
begin
Dir := Dir + FSearchRect.Name + '\';
FillFileList(Dir);
end else
if FileExists( Dir + FSearchRect.Name) then
FFileList.Add(Dir + FSearchRect.Name);
end;
until SysUtils.FindNext(FSearchRect) <> 0;

P := length(Dir) -1;

while Dir[P] <> '\' do
Dec(P);

Delete(Dir,P + 1,length(Dir));

if P <= 3 then SysUtils.FindClose(FSearchRect);
end;

function TFindFiles.GetFilesCount: Integer;
begin
Result := FFileList.Count;
end;

Esa clase te busca los archivos en el directorio especificado, ojo esa clase agrega a la lista solo los archivos.... mira el siguente poster.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Segunda parte

Publicado por emilio (175 intervenciones) el 22/11/2007 15:31:36
Extrayendo los archivos

Botton1OnClick
var
Buscador : TFindFiles;
begin
Buscador := TFindFiles.Create;
try
if Buscador.Execute(C:\MEDIOS\MEDIO2) and (Buscardor.FilesCount > 0) then //se encontraron archivos has algo con ellos.
begin
for I := 0 to Buscador.FilesList do
begin

end;

end;
finally
Buscador.Free;
end;

RmDir(C:\MEDIOS\MEDIO2);

end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por emilio (175 intervenciones) el 22/11/2007 15:45:25
En los poster llamado Segunda parte te mostre como usar la clase TFindFiles, el ejemplo esta bastante precario pero creo que te puede servir, la clase TFindFiles garantiza la busqueda de todos los archivos y el cierre del handle; luego podes hacer todo eso de la copia y eliminacion de archivos.

CHE!!!!, es RemuveDir('C:\MEDIOS\MEDIO2') SIN SLASH!!!!!!!!!, :D.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:DIRECTORIOS

Publicado por Mariano (46 intervenciones) el 24/11/2007 02:06:33
Muchisimas gracias Emilio!!!

De veras has sido mi salvación. :D
Muchas gracias de nuevo.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar