我已经获得了一项任务,要求我们对给定目录中的所有文件执行某些操作。对于遇到的每个目录,我们应该分叉我们程序的另一个实例。我的初始方法使用opendir()
和readdir()
,但我发现readdir()
枚举目录中的 所有 条目(不是只是顶级项目),因此一些条目将被处理多次(一次由父进程处理,一次用于每个子进程,直到文件在“root”中)。例如,给定以下文件系统树:
.
├── 1.txt
├── a
│ ├── 2.txt
│ ├── 3.txt
│ └── c
│ └── 4.txt
└── b
└── 5.txt
如果我在.
上调用我的程序,它将处理1.txt
,并创建两个子进程,分别用于a
和b
,然后等待这些进程完成。
第一个子流程适用于2.txt
和3.txt
,并为c
创建另一个子流程。
第三个子进程适用于5.txt
简单地说:我不知道如何只读取目录的一个级别
我可以继续使用我的初始方法,但我觉得 真的 效率低,只能忽略我正在检查的直接文件夹中的所有内容。< / p>
编辑1 :示例代码:
int process(std::string binpath, std::string src)
{
DIR* root = nullptr;
root = opendir(source.c_str());
if(root == nullptr)
{
return -1;
}
struct dirent* details;
struct stat file;
std::string path;
std::queue<int> childPids;
bool error = false;
while((details = readdir(root)) != nullptr)
{
path = source + details->d_name;
lstat(path.c_str(), &file);
if(IsDirectory(file.st_mode))
{
if(strcmp(details->d_name, ".") == 0 || strcmp(details->d_name, "..") == 0)
{
continue;
}
// Fork and spawn new process and remember child pid
auto pid = fork();
if(pid == 0)
{
char* args[] = {
(char*) "-q",
(char*)"-s", const_cast<char*>(path.c_str()),
NULL
};
char* env[] = {NULL};
execve(binpath.c_str(), args, env);
}
else
{
childPids.push(pid);
}
}
else
{
if(!DoWorkOnFile(path)) error = true;
}
}
//Wait all child pids
while(!childPids.empty())
{
auto pid = childPids.front();
int status;
if(waitpid(pid, &status, 0) == pid)
{
if(status != 0) error = true;
}
else
{
error = true;
}
childPids.pop();
}
closedir(root);
return error ? -1 : 0;
}
答案 0 :(得分:0)
因此,我们假设您使用dirent并拥有类似以下教程的代码:http://www.dreamincode.net/forums/topic/59943-accessing-directories-in-cc-part-i/
您必须通过d_type区分dirent结构提供的文件和目录。
看看这里:http://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html
这样你就可以让他只列出一个目录的文件。