逻辑、代码简单,直接贴
头文件:traverse_dir.h
// Copyright(c) 2018 ALEX All rights reserved
// 遍历目录
// 创建时间:2018-07-24 17:11
// 作者:ALEX
#ifndef APP_TRAVERSE_DIR_H_
#define APP_TRAVERSE_DIR_H_
namespace apputils
{
// 回调函数,接收遍历到的数据
typedef void(*TraverseDirCallback)(const char *filepath, const char *filename);
// 遍历目录
// multi = true 递归遍历, false遍历一级目录
// suffix 遍历目录内固定后缀文件,如:*.* 任意文件; *.zip遍历压缩文件等
int TraverseDir(const char *dir, const char *suffix,
bool multi, TraverseDirCallback callback);
}
#endif // !APP_TRAVERSE_DIR_H_
cpp文件:traverse_dir.cc
#include "traverse_dir.h"
#include <stdio.h>
#include <Windows.h>
#include <io.h>
namespace apputils
{
int TraverseDir(const char *dir, const char *suffix,
bool multi, TraverseDirCallback callback)
{
if (!dir)
return 1;
char dir_new[MAX_PATH] = { 0 };
snprintf(dir_new, MAX_PATH, "%s\\%s", dir, suffix);
intptr_t handle;
_finddata_t file_data;
handle = _findfirst(dir_new, &file_data);
if (handle == -1)
{
printf("dir is not exits.\n");
return 1;
}
do
{
if (file_data.attrib & _A_SUBDIR)
{
if (strcmp(file_data.name, ".") == 0 ||
strcmp(file_data.name, "..") == 0)
continue;
if (multi == true)
{
memset(dir_new, 0, MAX_PATH);
snprintf(dir_new, MAX_PATH, "%s\\%s", dir, file_data.name);
TraverseDir(dir_new, suffix, multi, callback);
}
}
else
{
(*callback)(dir, file_data.name);
}
} while (0 == _findnext(handle, &file_data));
_findclose(handle);
return 0;
}
}
调用:main.cc
#include <stdio.h>
#include "traverse_dir.h>
#using namespace apputils;
void TraverseDirCallback(const char *filepath, const char *filename)
{
printf("遍历目录回调:filepath:%s,filename:%s\n", filepath, filename);
}
int main() {
// 遍历一级目录
if (TraverseDir("d:\\test", "*.zip", false, TraverseDirCallback) != 0)
{
printf("遍历失败\n");
}
printf("-------------------------------------------\n");
// 递归遍历目录
if (TraverseDir("d:\\test", "*.zip", true, TraverseDirCallback) != 0)
{
printf("遍历失败\n");
}
getchar();
return 0;
}