Autor
|
Tema: [Source] Listando directorios y archivos en C/C++ (Leído 29,426 veces)
|
~~
|
Bueno, pues como veo que hay dudas respecto a esto en el foro (y yo necesitaba hacerlo tambien ) me e decidido a compartir con vosotros un sencillo codigo que lista directorios y carpetas con las apis FindFirstFile y FindNextFile. Espero que os sea util ACTUALIZADO Y MEJORADO: ////////////////////////////// // Listando directorios y // // carpetas de una ruta // // By E0N // ////////////////////////////// #include <iostream> #include <windows.h> using namespace std; void listarDirectorio(char* dir) { WIN32_FIND_DATA findFileData; HANDLE hFind; strcat (dir,"\\*"); hFind = FindFirstFile(dir, &findFileData); if (hFind == INVALID_HANDLE_VALUE) std::cout << "Ruta incorrecta"; else { std::cout << findFileData.cFileName << '\n'; //El primer fichero // Listamos todos los ficheros restantes while (FindNextFile(hFind, &findFileData) != 0) std::cout << findFileData.cFileName << '\n'; } } void main() { char* dir = new char[MAX_PATH]; cout << "Introduzca el nombre de la ruta a explorar: "; cin >> dir; cout << "\n\n"; listarDirectorio(dir); delete(dir); }
Código viejo: #include <stdio.h> #include <iostream> #include <windows.h>
#define BUFSIZE MAX_PATH
void main() { WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; LPSTR Dir; Dir = (LPSTR) malloc (BUFSIZE);
std::cout << "Introduzca el nombre de la ruta a explorar: "; std::cin >> Dir; strcat (Dir,"\\*"); //Le añadimos un \* al final de la ruta para que pueda listar los direcrorios bien
hFind = FindFirstFile(Dir, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) { std::cout << "Ruta incorrecta" << '\a'; } else { std::cout << FindFileData.cFileName << '\n'; //El primer fichero // Listamos todos los ficheros del directorio while (FindNextFile(hFind, &FindFileData) != 0) //Mientras q la funcion q lista el siguiente fichero, es decir //FindNextFile, no nos devuelva nulo... { std::cout << FindFileData.cFileName << '\n'; //...listamos el resto de ficheros y directorios } } free(Dir); }1S4ludo
|
|
« Última modificación: 18 Octubre 2008, 18:26 pm por E0N »
|
En línea
|
|
|
|
Override
|
Una duda namás No acaso la libearia Iostream se usa en C++? pero veo que usas C y aparte usas malloc, como comentario en Cpp ya no se usa malloc, se usa new[] y delete[] para crear heaps.. y también en C++ el uso de define ya es obsoleto se usa Const para las constantes... No sé, se presta a confusiones, yo antes pensaba que por codear en VC++ estructuradamente codeaba en C++, pero era C, jeje, c++ como debes saber es hijo de C al cual se le agrega la POO (clases, herencia, polimorfismo, objetos, encapsulación, atributos, métodos blah blah) Un saludo pd: Nada más hago esta observacion, lo demás tú código estuvo bien
|
|
« Última modificación: 30 Mayo 2007, 18:16 pm por Override »
|
En línea
|
|
|
|
~~
|
|
|
|
En línea
|
|
|
|
Override
|
Jajaja Es gracioso, por que vamos a la inversa entonces, a ti te queda más fácil malloc? a mí new por otro lado tampoco he recibido clases "de programación". Pero te recomiendo un buen libro: "Fundamentos De Programacion, Algoritmos, Estructuras De Datos Y O Bjetos - 3ª Ed." Editorial McGrawHill buscalo y un saludo
|
|
« Última modificación: 30 Mayo 2007, 19:05 pm por Override »
|
En línea
|
|
|
|
Juan_Perez
Desconectado
Mensajes: 148
|
Aquí les paso un ejemplo de una función recursiva en C++ que busca un archivo en una carpeta y todas sus subcarpetas. Hice dos versiones, una para Windows y otra para GNU/Linux. La versión para Windows la compilé con el Visual C++ .NET 2003 y el Dev C++ 4.9.9.2 bajo Windows XP pro SP2, y la de GNU/Linux con el g++ 4.1.2 bajo Ubuntu 6.0. Probé ambos programas y aparentemente si encuentra las carpetas en donde se encuentra el archivo a buscar. Si lo prueban y encuentran errores les agradecería me los comentaran para corregirlos. Versión Windows #include <iostream> #include <vector> #include <string>
using namespace std;
#include <direct.h> #include <io.h>
void FindFile (const string& archivo, const string& carpeta) { static struct _finddata_t c_file; static long hFile; static string filespec;
filespec = carpeta + "\\*.*"; if ((hFile = _findfirst (filespec.c_str(), &c_file )) == -1L ) return;
vector<string> carpetas; do { if ((c_file.attrib & _A_ARCH) != 0) { // no es un subdirectorio if (c_file.name == archivo) cout << '[' << carpeta << ']' << endl; } else if ((c_file.attrib & _A_ARCH) == 0 && strcmp (c_file.name, ".") && strcmp (c_file.name, "..")) carpetas.push_back (c_file.name); } while (_findnext( hFile, &c_file ) == 0); _findclose( hFile );
for (int i = 0; i < carpetas.size (); ++i) FindFile (archivo, carpeta + "\\" + carpetas[i]); }
int main(int argc, char* argv[]) { FindFile ("TimerSessionClient.java", "C:\\temp"); return 0; }
Versión GNU/Linux #include <iostream> #include <vector> #include <string>
#include <stdlib.h> #include <dirent.h> #include <sys/stat.h>
using namespace std;
void FindFile (const string& archivo, const string& carpeta) { static DIR *dir; static struct dirent *mi_dirent; if( (dir = opendir (carpeta.c_str())) == NULL ) return;
vector<string> carpetas; while ((mi_dirent = readdir (dir)) != NULL) { if (string (mi_dirent->d_name) == "." || string (mi_dirent->d_name) == "..") continue; string cadina = carpeta + '/' + mi_dirent->d_name; struct stat structura; if (stat (cadina.c_str(), &structura) < 0) ;//cout << "error en stat" << endl; else if (S_ISDIR (structura.st_mode)) carpetas.push_back (mi_dirent->d_name); else if (archivo == mi_dirent->d_name) cout << '[' << cadina << ']' << endl; } closedir (dir);
for (int i = 0; i < carpetas.size(); ++i) FindFile (archivo, carpeta + '/' + carpetas[i]); }
int main ( int argc, char *argv[] ) { FindFile ("sony-sleep", "/etc"); return 0; }
|
|
|
En línea
|
|
|
|
jhonder31
Desconectado
Mensajes: 1
|
amigos nesecito hacer este programa pero en C ansi porfa les ruego su ayuda, o almenos diganme en que lenguaje estan esos que ustedes hicieron porque lo he probado en c++, en visual c++ y en nungino me funciona me da un error de librerias, les agradeceria mucho su ayuda.
|
|
|
En línea
|
|
|
|
egyware
|
amigos nesecito hacer este programa pero en C ansi porfa les ruego su ayuda, o almenos diganme en que lenguaje estan esos que ustedes hicieron porque lo he probado en c++, en visual c++ y en nungino me funciona me da un error de librerias, les agradeceria mucho su ayuda.
Reemplazas los cout por printf y ya. Bueno, pues como veo que hay dudas respecto a esto en el foro (y yo necesitaba hacerlo tambien ) me e decidido a compartir con vosotros un sencillo codigo que lista directorios y carpetas con las apis FindFirstFile y FindNextFile. Espero que os sea util .... Excelente aporte, lo utilizare de inmediato
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Si ven que un newbie levanta un hilo de hace años no le respondan por favor.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema listando proceso en win32
Programación C/C++
|
Uknow
|
3
|
2,674
|
20 Noviembre 2011, 06:06 am
por naderST
|
|
|
Estructura de archivos y directorios XP
Windows
|
josepeet_4
|
2
|
3,723
|
2 Diciembre 2011, 17:02 pm
por josepeet_4
|
|
|
[APORTE] Interceptar Archivos/Directorios USB
« 1 2 »
.NET (C#, VB.NET, ASP)
|
kub0x
|
16
|
9,731
|
17 Abril 2012, 23:22 pm
por kub0x
|
|
|
¿Por qué Windows tiene dos directorios de Archivos de programa y uno es x86?
Noticias
|
wolfbcn
|
0
|
1,851
|
9 Junio 2015, 18:33 pm
por wolfbcn
|
|
|
Problema listando archivos de un directorio C++
Programación C/C++
|
Kaxperday
|
0
|
1,786
|
8 Diciembre 2015, 01:00 am
por Kaxperday
|
|