这是第一种方法
#include <iostream>
#include <io.h>
using namespace std;
bool TraverseDirectory(std::string path)
{
_finddata_t FileInfo;
string strFind = path + "\\*";
long Handle = _findfirst(strFind.c_str(), &FileInfo);
if (Handle == -1L)
{
return false;
}
do
{
//判断是否有子目录
if (FileInfo.attrib & _A_SUBDIR)
{
//下面的判断条件很重要,过滤 . 和 ..
if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
{
string newPath = path + "\\" + FileInfo.name;
TraverseDirectory(newPath);
}
}
else
{
string newPath = path + "\\" + FileInfo.name;
cout << newPath << endl;
}
} while (_findnext(Handle, &FileInfo) == 0);
_findclose(Handle);
return true;
}
下面是第二种方法,利用windows api来实现
原文:点击跳转
#include <iostream>
#include "windows.h"
#include <string.h>
#include <strsafe.h>
using namespace std;
void TraverseDirectory(wchar_t Dir[MAX_PATH])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
wchar_t DirSpec[MAX_PATH];
DWORD dwError;
StringCchCopy(DirSpec, MAX_PATH, Dir);
StringCchCat(DirSpec, MAX_PATH, TEXT("\\*"));
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
FindClose(hFind);
return;
}
else
{
while (FindNextFile(hFind, &FindFileData)!=0)
{
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0 && wcscmp(FindFileData.cFileName,L".")==0 || wcscmp(FindFileData.cFileName,L"..")==0)
{
continue;
}
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0)
{
wchar_t DirAdd[MAX_PATH];
StringCchCopy(DirAdd, MAX_PATH, Dir);
StringCchCat(DirAdd, MAX_PATH, TEXT("\\"));
StringCchCat(DirAdd, MAX_PATH, FindFileData.cFileName);
TraverseDirectory(DirAdd);
}
if ((FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0)
{
wcout << Dir << "\\" << FindFileData.cFileName << endl;
}
}
FindClose(hFind);
}
}