#include<iostream>
#include<string>
#include<io.h> //结构体srtuct _finddata_t所在头文件
using namespace std;
const int MAXLEN = 1024; //用于定义目录最大长度数值
unsigned long FILECOUNT = 0; //用于记录文件数量(文件数量为正数)
void ListDir(const char* pchData) {
_finddata_t fdata; //定义查找文件的结构体对象
long done; //用于接收文件查找函数返回的句柄
char tempdir[MAXLEN] = { 0 }; //用于存储文件的目录
strcat(tempdir, pchData); //连接字符串,将函数ListDir的参数(所查找的指定目录)连接到数组中
strcat(tempdir, "\\*.*"); //连接字符串,在_findfirst函数中,第一个参数为文件名,可以用"*.*"来查找所有文件
done = _findfirst(tempdir, &fdata); //在_findfirst函数中,第二个参数是_finddata_t结构体指针。
//若查找成功,返回文件句柄,若失败,返回-1。
if (done != -1) {
int ret = 0; //用于接收文件查找函数返回的句柄,并用于while循环判断
while (ret != -1) {
if (fdata.attrib != _A_SUBDIR) { //判断文件属性是否为文件夹
if (strcmp(fdata.name, "...") != 0 &&
strcmp(fdata.name, "..") != 0 &&
strcmp(fdata.name, ".") != 0) { //文件过滤
char dir[MAXLEN] = { 0 }; //用于存储文件路径及名称
strcat(dir, pchData); //连接字符串,将函数ListDir的参数(所查找的指定目录)连接到数组中
strcat(dir, "\\"); //连接字符串,在数组dir原本的字符串后加"\"
strcat(dir, fdata.name); //连接字符串,在数组dir原本的字符串后加上文件的名称
cout << dir << endl; //输出查找的文件
FILECOUNT++; //文件数量加1
}
}
ret = _findnext(done, &fdata); //在_findnext函数中,第一个参数为文件句柄,
//第二个参数为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。
if (fdata.attrib == _A_SUBDIR&&ret != -1) { //判断文件属性,如果是文件夹,则递归调用函数ListDir()
//查找该文件下的内容
if (strcmp(fdata.name, "...") != 0 &&
strcmp(fdata.name, "..") != 0 &&
strcmp(fdata.name, ".") != 0) { //文件过滤
char pdir[MAXLEN] = { 0 }; //用于存储文件路径及名称
strcat(pdir, pchData); //连接字符串,将函数ListDir的参数(所查找的指定目录)连接到数组中
strcat(pdir, "\\"); //连接字符串,在数组pdir原本的字符串后加"\"
strcat(pdir, fdata.name); //连接字符串,在数组pdir原本的字符串后加上文件的名称
ListDir(pdir); //递归调用函数ListDir查找该文件夹下的文件
}
}
}
}
}
int main(void) {
while (true) //使用一个while无限循环(循环中判断是否退出循环)
{
FILECOUNT = 0;
char szFileDir[128] = { 0 }; //用于记录需要查找的文件路径(目录)
cout << "请输入需要查找的文件路径(目录),输入‘e’退出。" << endl;
cin >> szFileDir;
if (strcmp(szFileDir, "e") == 0) { //判断是否退出循环
break;
}
ListDir(szFileDir); //调用ListDir函数
cout << "共计" << FILECOUNT << "个文件。" << endl; //输出目录下文件的总数
}
return 0;
}
转载于:https://my.oschina.net/u/3418740/blog/876397