c - listar - opendir readdir
Listado del contenido del directorio usando C y Windows (3)
Estoy buscando enumerar y almacenar el contenido de un directorio en una estructura usando C en Windows.
No necesariamente estoy buscando a alguien que escriba el código que estoy buscando, sino que me señale la dirección correcta en lo que respecta a qué biblioteca debería estar viendo.
He estado buscando en Google por algunas horas y todo lo que encuentro es C #, C ++ solutions, por lo que cualquier ayuda sería muy apreciada.
Como todos los demás dijeron (con FindFirstFile, FindNextFile y FindClose) ... ¡pero con recursión!
bool ListDirectoryContents(const char *sDir)
{
WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
char sPath[2048];
//Specify a file mask. *.* = We want everything!
sprintf(sPath, "%s//*.*", sDir);
if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
printf("Path not found: [%s]/n", sDir);
return false;
}
do
{
//Find first file will always return "."
// and ".." as the first two directories.
if(strcmp(fdFile.cFileName, ".") != 0
&& strcmp(fdFile.cFileName, "..") != 0)
{
//Build up our file path using the passed in
// [sDir] and the file/foldername we just found:
sprintf(sPath, "%s//%s", sDir, fdFile.cFileName);
//Is the entity a File or Folder?
if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
{
printf("Directory: %s/n", sPath);
ListDirectoryContents(sPath); //Recursion, I love it!
}
else{
printf("File: %s/n", sPath);
}
}
}
while(FindNextFile(hFind, &fdFile)); //Find the next file.
FindClose(hFind); //Always, Always, clean things up!
return true;
}
ListDirectoryContents("C://Windows//");
Y ahora su contraparte UNICODE:
bool ListDirectoryContents(const wchar_t *sDir)
{
WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
wchar_t sPath[2048];
//Specify a file mask. *.* = We want everything!
wsprintf(sPath, L"%s//*.*", sDir);
if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
wprintf(L"Path not found: [%s]/n", sDir);
return false;
}
do
{
//Find first file will always return "."
// and ".." as the first two directories.
if(wcscmp(fdFile.cFileName, L".") != 0
&& wcscmp(fdFile.cFileName, L"..") != 0)
{
//Build up our file path using the passed in
// [sDir] and the file/foldername we just found:
wsprintf(sPath, L"%s//%s", sDir, fdFile.cFileName);
//Is the entity a File or Folder?
if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
{
wprintf(L"Directory: %s/n", sPath);
ListDirectoryContents(sPath); //Recursion, I love it!
}
else{
wprintf(L"File: %s/n", sPath);
}
}
}
while(FindNextFile(hFind, &fdFile)); //Find the next file.
FindClose(hFind); //Always, Always, clean things up!
return true;
}
ListDirectoryContents(L"C://Windows//");
Para listar el contenido de los archivos, puede buscar en un directorio con estas API: FindFirstFileEx , CloseFind y CloseFind . Deberá #include <windows.h
, que le dará acceso a la API de Windows. Son funciones C y tan compatibles con C ++. Si desea "específicamente C ++", intente buscar listados de directorios usando MFC.