FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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; } |
#2
|
||||
|
||||
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. |
#3
|
||||
|
||||
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. |
#4
|
||||
|
||||
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
__________________
Lo importante no es llegar primero, sino saber llegar. Para que puedas llegar mejor lee la Guia de Estilo |
#5
|
|||
|
|||
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! |
#6
|
||||
|
||||
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!!! |
#7
|
|||
|
|||
Gracias!!!! agradezco tus buenas intenciones!
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Listar archivos de directorio a travez de FTP | ilichhernandez | Internet | 6 | 22-09-2006 01:03:14 |
Listar una carpeta | [Gunman] | API de Windows | 4 | 03-01-2006 16:25:43 |
adjuntar el archivo que esta dentro una carpeta | kinteam1 | Internet | 1 | 11-10-2005 22:32:01 |
Listar archivos d 1a URL y descargarlos | Descendents | Internet | 0 | 06-11-2003 17:29:41 |
Listar ficheros dentro de un arbol | olaya | API de Windows | 2 | 11-08-2003 19:44:15 |
|