Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   listar archivos jpg dentro de una carpeta con subcarpetas (https://www.clubdelphi.com/foros/showthread.php?t=37788)

JuanErasmo 22-11-2006 23:56:03

listar archivos jpg dentro de una carpeta con subcarpetas
 
hola amigos...
Estoy desarrollando una aplicacion que basado en una carpeta, debo obtener el contenido de todo lo que hay dentro de ella, subcarpetas, archivos....
lo estoy intentando asi
Código:

DIR *dir;
        struct dirent *ent;
        if ((dir = opendir(Directorio.c_str())) == NULL){
                ShowMessage("ERROR al abrir el directorio: "+Directorio);
        }else {
                int bmps=0,avis=0,docs=0,edad=0,edad_file=0;
        while ((ent = readdir(dir)) != NULL) {
                nombre_file=ent->d_name;
                extension=ExtractFileExt(nombre_file);
                edad_file=FileAge(Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file);
        if(edad<edad_file) edad=edad_file;
                if(nombre_file!="." && nombre_file!="..") {
                        if(DirectoryExists(Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file)){
                              Path=Directorio;
                              LMDMemo1->Lines->Add(nombre_file + "  Dir");
                              direc++;
                            //  Directorio = (Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file);
                            //  carpetas[direc] = Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file;
                            //  Directorio = (Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file);
                        }
                        else if(FileExists(Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file)){
                      //  else{
                              LMDMemo1->Lines->Add(nombre_file + "  Archivo");
                              files++;
                            // Directorio = Path;
                        }
                    /*    if (extension==".jpg" || extension==".jpg") {
                                bmps++;
                        }else if (extension==".avi" || extension==".AVI") {
                                avis++;
                        }else if (extension==".bmp" || extension==".bmp") {
                                docs++;
                        }else if(DirectoryExists(Directorio+"<A href="file://\\"+nombre_file">\\"+nombre_file)) {
                                LMDMemo1->Lines->Add(nombre_file + "  Dir");
                                Directorio = Directorio +"\\"+ nombre_file;
                              //  LMDSpeedButton2->Click();
                        }else{
                                LMDMemo1->Lines->Add(nombre_file);
                        }
                      */
        }
      }
      delete dir;
      }

el problema es que asi solo me arroja el contenido de la carpeta,...no de los subdirectorios que tiene lo que necesito es como un buscador de archivos para poderlos manipular luego...........gracias!!!

ixMike 24-11-2006 20:01:08

Bueno, me parece que lo que necesitas (algo así necesitó yo hace un tiempo) es que el método se llame a sí mismo cada vez que se encuentre con una carpeta. Me eplico:
1º Llamas al método, con un directorio inicial (p.e. "C:\Archivos de programa\"
2º El método va analizando todo lo que hay (carpetas y archivos). Entonces: si encuentra un archivo, que lo procese. Si encuetra una carpeta, que se llame a sí mismo con ese nuevo directorio (p.e. "C:\Archivos de programa\UnProgramaInstalado") y así sucesivamente hasta que acabe.

Te recomiendo que coloques una barra de progreso o un mensaje avisando, porque a veces puede ser un proceso lento (si buscas en directorios con mucho contenido).

Buscaré ese código que hice (en Delphi) y lo pondré aquí un día de estos.

Saludos.

aeff 25-11-2006 04:05:23

algo parecido!!!
 
es posible que para buscar los archivos de una carpeta y los archivos de las subcarpetas, la siguiente función que te muestro te sea de gran utilidad, lo que la he desarrollado en Delphi, si tienes algún problema para traducirla a C te puedo ayudar...

procedure SearchFiles(Path: string; vList: TStringList; all: boolean);
var
p, fn: string;
fs: TSearchRec;
attr: Integer;
begin
if trim(ExtractFileName(path)) = '' then fn := '*.*' else fn := trim(ExtractFileName(path));
p := ExtractFilePath(path);
{Buscamos los ficheros}
attr := faArchive;
if FindFirst(p + fn ,attr, fs) = 0 then
vList.Add( p + fs.Name);
while FindNext(fs) =0 do
vList.Add( p + fs.Name);
{Buscamos las carpetas}
attr := faDirectory;
if FindFirst(p + '\*..' ,attr, fs) = 0 then
if (fs.Name <> '.') and (fs.Name <> '..') and (all) then
SearchFiles(p + fs.Name + '\*.*', vlist, all);
while FindNext(fs) =0 do
if (fs.Name <> '.') and (fs.Name <> '..') and (all) then
SearchFiles(p + fs.Name + '\*.*', vList, all);
end;


un ejemplo de llamada a la función
...
var
x: TStringList;
begin
x := TStringList.Create;
SearchFiles('C:\*.*', x, CheckBox1.Checked);
Memo1.Lines.Clear;
Memo1.Lines.Add(x.Text);
end;
...
/////////////////////-----

para obtener algunos datos de los ficheros, desarrollé la siguiente, digo, si te hace falta:

type TFDEspec = record
Fecha, Hora: string;
end;
type TFileDates = record
dCreation: TFDEspec;
dLastAccessTime: TFDEspec;
dLastWrite: TFDEspec;
end;
function GetFileDates(pFN: TFileName): TFileDates;
var
vFoundData: _WIN32_FIND_DATA;
c_SysTime, at_SysTime, lw_SysTime: TSystemTime;
begin
{Buscando el archivo y obteniendo sus datos}
FindFirstFile(pChar(pFN), vFoundData);
{Convirtiendo los datos a datos del sistem}
FileTimeToSystemTime(vFoundData.ftCreationTime, c_SysTime);
FileTimeToSystemTime(vFoundData.ftLastAccessTime, at_SysTime);
FileTimeToSystemTime(vFoundData.ftLastWriteTime, lw_SysTime);
{Elaborando los resultados}
{Creaci
ón}
Result.dCreation.Fecha := IntToStr(c_SysTime.wDay) + '/' + IntToStr(c_SysTime.wMonth) + '/' + IntToStr(c_SysTime.wYear);
Result.dCreation.Hora := IntToStr(c_SysTime.wHour) + ':' + IntToStr(c_SysTime.wMinute) + ':' +IntToStr(c_SysTime.wSecond) + ':' +IntToStr(c_SysTime.wMilliseconds);
{Último acceso}
Result.dLastAccessTime.Fecha := IntToStr(at_SysTime.wDay) + '/' + IntToStr(at_SysTime.wMonth) + '/' + IntToStr(at_SysTime.wYear);
Result.dLastAccessTime.Hora := IntToStr(at_SysTime.wHour) + ':' + IntToStr(at_SysTime.wMinute) + ':' +IntToStr(at_SysTime.wSecond) + ':' +IntToStr(at_SysTime.wMilliseconds);
{Última escritura}
Result.dLastWrite.Fecha := IntToStr(lw_SysTime.wDay) + '/' + IntToStr(lw_SysTime.wMonth) + '/' + IntToStr(lw_SysTime.wYear);
Result.dLastWrite.Hora := IntToStr(lw_SysTime.wHour) + ':' + IntToStr(lw_SysTime.wMinute) + ':' +IntToStr(lw_SysTime.wSecond) + ':' +IntToStr(lw_SysTime.wMilliseconds);
end;

espero que de algo te sirva!!! salu2.

yusnerqui 25-11-2006 14:44:13

Hola aeff, te recomiento uses las etiquetas VB para hacer más legible tú código, fíjate que ya tienes 41 mensajes, o sea, que estás bastante crecidito para dejar de usarlas.

Saludos Yusnerqui :)

JuanErasmo 28-11-2006 19:03:48

Si me puedes ayudar...
 
Hola!!...
Creo que si neceisto ayuda para pasar esa funcion a Builder C++....
no tengo mucha experiencia, pero tengo muchas ganas de aprender!
Gracias!

aeff 06-12-2006 22:26:00

respondiendo a última hora...
 
disculpa la demora, es que estaba de viaje... ahora es que venga a sentarme en la PC... y te voy a mandar la función de buscar los archivos implementada en C,

void SearchFiles(AnsiString Path, TStringList &vList, bool iFolders, bool all)
{
AnsiString p, fn;
int attr;
TSearchRec fs;
if (Trim(ExtractFileName(Path)) == "*.*") fn = "*.*"; else fn = Trim(ExtractFileName(Path));
p = ExtractFilePath(Path);
/*Buscamos los ficheros*/
attr = faArchive;
if (FindFirst(p + fn, attr, fs) == 0)
vList.Add(p + fs.Name);
while (FindNext(fs) == 0)
vList.Add(p + fs.Name);
/*Buscamos las carpetas, si se ha especificado*/
if (iFolders)
{
attr = faDirectory;
if (FindFirst(p + "\*..", attr, fs) == 0)
{
if (!all) vList.Add(p + fs.Name);
if ((fs.Name != ".") && (fs.Name != "..") && (all))
SearchFiles(p + fs.Name, vList, iFolders, all);
}
while (FindNext(fs) == 0)
{
if (!all) vList.Add(p + fs.Name);
if ((fs.Name != ".") && (fs.Name != "..") && (all))
SearchFiles(p + fs.Name + "\\" + fn, vList, iFolders, all);
}
}
FindClose(fs);
}

ahora, un ejemplo de llamada en un evento cualquiera:

TStringList *vLista = new TStringList();
SearchFiles("C:\\UsrMan\\*.*", *vLista, true, false);
Memo1->Text = vLista->Text;

espero que te sirva de algo aunque sea un poco demorada mi respuesta,

salu2!!!

JuanErasmo 06-12-2006 22:52:49

Gracias!!!! agradezco tus buenas intenciones!


La franja horaria es GMT +2. Ahora son las 17:57:38.

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