在公司写的遍历磁盘获取磁盘下所有录像文件信息的两个函数。
#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