PDA

Ver la Versión Completa : listar archivos jpg dentro de una carpeta con subcarpetas


JuanErasmo
22-11-2006, 23:56:03
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 asiDIR *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
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
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
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!