Click to See Complete Forum and Search --> : Windows SDK File System: How to search for files in a directory and subdirectories?


Andreas Masur
October 2nd, 2004, 03:02 PM
Q: How to search for files in a directory and subdirectories?

A:


#include <string>
#include <vector>
#include <iostream>

#include <windows.h>
#include <conio.h>



int SearchDirectory(std::vector<std::string> &refvecFiles,
const std::string &refcstrRootDirectory,
const std::string &refcstrExtension,
bool bSearchSubdirectories = true)
{
std::string strFilePath; // Filepath
std::string strPattern; // Pattern
std::string strExtension; // Extension
HANDLE hFile; // Handle to file
WIN32_FIND_DATA FileInformation; // File information


strPattern = refcstrRootDirectory + "\\*.*";

hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
if(FileInformation.cFileName[0] != '.')
{
strFilePath.erase();
strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName;

if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(bSearchSubdirectories)
{
// Search subdirectory
int iRC = SearchDirectory(refvecFiles,
strFilePath,
refcstrExtension,
bSearchSubdirectories);
if(iRC)
return iRC;
}
}
else
{
// Check extension
strExtension = FileInformation.cFileName;
strExtension = strExtension.substr(strExtension.rfind(".") + 1);

if(strExtension == refcstrExtension)
{
// Save filename
refvecFiles.push_back(strFilePath);
}
}
}
} while(::FindNextFile(hFile, &FileInformation) == TRUE);

// Close handle
::FindClose(hFile);

DWORD dwError = ::GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
return dwError;
}

return 0;
}


int main()
{
int iRC = 0;
std::vector<std::string> vecAviFiles;
std::vector<std::string> vecTxtFiles;


// Search 'c:' for '.avi' files including subdirectories
iRC = SearchDirectory(vecAviFiles, "c:", "avi");
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}

// Print results
for(std::vector<std::string>::iterator iterAvi = vecAviFiles.begin();
iterAvi != vecAviFiles.end();
++iterAvi)
std::cout << *iterAvi << std::endl;

// Search 'c:\textfiles' for '.txt' files excluding subdirectories
iRC = SearchDirectory(vecTxtFiles, "c:\\textfiles", "txt", false);
if(iRC)
{
std::cout << "Error " << iRC << std::endl;
return -1;
}

// Print results
for(std::vector<std::string>::iterator iterTxt = vecTxtFiles.begin();
iterTxt != vecTxtFiles.end();
++iterTxt)
std::cout << *iterTxt << std::endl;

// Wait for keystroke
_getch();

return 0;
}

<br>

Andreas Masur
October 2nd, 2004, 03:07 PM
class CFoo
{
//...
// Operations
public:
static void SearchDirectory(LPCTSTR pszRootPath,
CStringArray& arrFiles,
bool bRecursive = true);
//...
};

void CFoo::SearchDirectory(LPCTSTR pszRootPath,
CStringArray& arrFiles,
bool bRecursive /*= true*/)
{
CString strToFind;
strToFind.Format(_T("%s\\*.*"), pszRootPath);

CFileFind ff;
BOOL bFound = ff.FindFile(strToFind);
while(bFound)
{
bFound = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
if(true == bRecursive)
{
CString strRootPath = ff.GetFilePath();
SearchDirectory(strRootPath, arrFiles, bRecursive);
}
}
else if(!ff.IsDots() && !ff.IsDirectory())
{
CString strFilePath = ff.GetFilePath();
arrFiles.Add(strFilePath);
}
}
}

void CWhateverFoo::WhateverFunction()
{
//...
CStringArray arrFiles;
CFoo::SearchDirectory(_T("c:\\Images"), arrFiles);
//...
}


FAQ contributed by: [ovidiucucu (http://www.codeguru.com/forum/member.php?u=89934)]
<br><br>