Linux和Windows遍历磁盘所有文件

在公司写的遍历磁盘获取磁盘下所有录像文件信息的两个函数。


#ifdef WIN32

#include <io.h>
//获取特定格式的文件名

void GetPlaybackFile::getAllFiles(std::string path, std::multimap<std::string, std::string>& mapfiles, std::string format)
{
	long  hFile = 0;//文件句柄  64位下long 改为 intptr_t
	struct _finddata_t fileinfo;//文件信息 
	std::string p;
	static std::string cameID;
	std::string filename;
	if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) //文件存在
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))//判断是否为文件夹
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//文件夹名中不含"."和".."
				{

					cameID = p.assign(path).append("\\").append(fileinfo.name); //保存文件夹名

					getAllFiles(p.assign(path).append("\\").append(fileinfo.name), mapfiles, format); //递归遍历文件夹
				}
			}
			else
			{
				filename = (p.assign(path).append("\\").append(fileinfo.name)).c_str();//如果不是文件夹,储存文件名
																					   //filename = p.assign(fileinfo.name);
				if (filename.find(".IFV") != std::string::npos)//找特定格式结尾的文件
				{
					mapfiles.insert(std::pair<std::string, std::string>(cameID, filename));
				}

			}

		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}

#else
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
void GetPlaybackFile::listDir(const char *path, std::multimap<std::string, std::string>& mapfiles, bool r = false)
{
	DIR *pDir;
	struct dirent *ent;
	char childpath[512] = { 0 };
	char absolutepath[512] = { 0 };
	char DirPath[512] = { 0 };
	pDir = opendir(path);
	//std::cout << "path = " << path << std::endl;
	if (pDir == NULL)
	{	
		std::cout << "open dir " << path << " error\r\n";
		return;
	}
	
		
	std::string p;
	static std::string cameID;
	std::string filename;
	memset(childpath, 0, sizeof(childpath));
	while ((ent = readdir(pDir)) != NULL)
	{
		if (ent->d_type & DT_DIR)
		{

			if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
			{
				continue;
			}
			if (r) //如果需要遍历子目录
			{

				sprintf(childpath, "%s%s/", path, ent->d_name);
				cameID = p.assign(childpath);
				listDir(childpath, mapfiles);
			}
		}
		else
		{
			sprintf(absolutepath, "%s%s", path, ent->d_name);
			filename = p.assign(absolutepath);
			if (filename == "")
				continue;
			if (filename.find(".IFV") != std::string::npos)//找特定格式的文件
			{
				mapfiles.insert(std::pair<std::string, std::string>(cameID, filename));
			}
		}
	}
	closedir(pDir);
}
#endif

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值