[C/C++]遍历目录下指定(任意)文件

逻辑、代码简单,直接贴

头文件: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值