在Unix C ++中列出文件夹根目录中的文件和目录

时间:2016-09-10 04:17:21

标签: c++ linux unix

我已经获得了一项任务,要求我们对给定目录中的所有文件执行某些操作。对于遇到的每个目录,我们应该分叉我们程序的另一个实例。我的初始方法使用opendir()readdir(),但我发现readdir()枚举目录中的 所有 条目(不是只是顶级项目),因此一些条目将被处理多次(一次由父进程处理,一次用于每个子进程,直到文件在“root”中)。例如,给定以下文件系统树:

.
├── 1.txt
├── a
│   ├── 2.txt
│   ├── 3.txt
│   └── c
│       └── 4.txt
└── b
    └── 5.txt

如果我在.上调用我的程序,它将处理1.txt,并创建两个子进程,分别用于ab,然后等待这些进程完成。

第一个子流程适用于2.txt3.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;
}

1 个答案:

答案 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

这样你就可以让他只列出一个目录的文件。