递归函数最适用的场合莫过于用来实现文件检索了。windows系统提供了FindFirstFile和FindNextFile两个系统调用,利用这两个函数,我们可以轻松实现windows下的文件检索。
源文件<demo.cpp>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;
int num = 0;
void SearchFile(wstring filePath);//文件检索函数
int main()
{
wstring path = L"C:";//设置根目录
SearchFile(path);//检索目录
printf("总文件个数:%d\n", num);
system("pause");
}
/*
*检索文件函数
*@param 文件夹路径
*/
void SearchFile(wstring filePath)
{
//定义一个结构,用于存放系统调用返回函数
WIN32_FIND_DATA findData = { 0 };
//FindFirstFile函数返回一个句柄,并将产找结果存入findData中
HANDLE handle = ::FindFirstFile((filePath+L"\\*.*").c_str(), &findData);
//判断句柄是否有效
if (INVALID_HANDLE_VALUE == handle)
{
return;
}
else
{
do
{
if (findData.cFileName[0] == L'.')//忽略当前目录(.)和上一级目录(..)
continue;
num++;//文件计数加一
if (findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)//该文件是目录文件
{
wstring tempFilePath = filePath + L"\\" + findData.cFileName;
SearchFile(tempFilePath);//递归调用,检索子目录
}
if (findData.dwFileAttributes&FILE_ATTRIBUTE_NORMAL)//该文件是普通文件
{
wcout << filePath + L"\\" + findData.cFileName << endl;
}
} while (FindNextFile(handle, &findData));//找到当前目录下的下一个文件
}
::FindClose(handle);//关闭查找句柄
}
注:wstring,wcout用法和string,cout是一样的,只不过所有的操作对象都变成了宽字符。