gpt4 book ai didi

C++多线程目录扫描代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:52 26 4
gpt4 key购买 nike

我在寻找如何编写多线程 C++ 代码来扫描目录并获取目录下所有文件的列表。我已经编写了可以执行此操作的单线程代码,并在可以执行此操作的代码下方编写了代码。

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <vector>
#include <string>
#include <iostream>
#include <sys/stat.h> /* for stat() */


using namespace std;
int isDir(string path)
;

/*function... might want it in some class?*/
int getdir (string dir, vector<string> &dirlist, vector<string> &fileList)
{
DIR *dp;
struct dirent *dirp, *dirFp ;
if((dp = opendir(dir.c_str())) == NULL) {
cout << "Error(" << errno << ") opening " << dir << endl;
return errno;
}

while ((dirp = readdir(dp)) != NULL) {
if (strcmp (dirp->d_name, ".") != 0 && strcmp(dirp->d_name, "..") != 0) {
//dirlist.push_back(string(dirp->d_name));

string Tmp = dir.c_str()+ string("/") + string(dirp->d_name);
if(isDir(Tmp)) {
//if(isDir(string(dir.c_str() + dirp->d_name))) {
dirlist.push_back(Tmp);
getdir(Tmp,dirlist,fileList);
} else {
// cout << "Files :"<<dirp->d_name << endl;
fileList.push_back(string(Tmp));
}

}
}
closedir(dp);
return 0;
}

int isDir(string path)
{
struct stat stat_buf;
stat( path.c_str(), &stat_buf);
int is_dir = S_ISDIR( stat_buf.st_mode);
// cout <<"isDir :Path "<<path.c_str()<<endl;
return ( is_dir ? 1: 0);
}

int main()
{
string dir = string("/test1/mfs");
vector<string> dirlist = vector<string>();
vector<string> fileList = vector<string>();

getdir(dir,dirlist,fileList);
#if 0
for (unsigned int i = 0;i < dirlist.size();i++) {
cout << "Dir LIst" <<dirlist[i] << endl;
//string dirF = dir + "/" + dirlist[i];
//getdir(dirF,fileList);
}
#endif
for (unsigned int i = 0; i < fileList.size(); i++)
cout << "Files :"<<fileList[i]<< endl;
return 0;
}

现在的问题是它是单线程的,我需要扫描大约 8000 个目录,在这些目录下可以存在文件。所以我不知道该怎么做,因为目录的数量可能会有所不同,因为它是由 N 维矩阵决定的。

在这方面的任何帮助都会很棒。提前致谢。

最佳答案

boost::filesystem有directory_iterator和recursive_directory_iterator,前者会获取目录的所有内容但不会递归子目录,后者也会递归子目录。

关于线程安全,您可以锁定一个互斥锁,然后将结果复制到一个 std::vector 或两个 vector 实例中,一个用于文件,一个用于目录,在这种情况下,您至少会有一个本地快照拷贝.

在那个时候实际“卡住”文件系统以停止任何修改它的进程不是您通常可以做的事情 - 好吧,您可以尝试将其上的文件属性设置为只读然后稍后将其更改回来但是你首先需要获得许可。

关于C++多线程目录扫描代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4649793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com