c ++列出所有目录和子目录(LINUX)

时间:2012-02-04 06:17:44

标签: c++ linux ubuntu directory

我是c ++的新手。有人可以请给我一些代码,说明如何在LINUX中获取所有目录及其所有子目录RECURSIVELY。我没有在互联网上找到任何可以帮助我的东西(或代码有效。)我需要获取所有带文件夹的文件; s子文件夹。

IN UBUNTU我没有getfiles,目录......

6 个答案:

答案 0 :(得分:7)

在Linux上试试这个:

#include <iostream>
#include <string>
#include <dirent.h>

void ProcessDirectory(std::string directory);
void ProcessFile(std::string file);
void ProcessEntity(struct dirent* entity);

std::string path = "/path/to/directory/";

int main()
{
    std::string directory = "theDirectoryYouWant";
    ProcessDirectory(directory);    

    return 0;
}

void ProcessDirectory(std::string directory)
{
    std::string dirToOpen = path + directory;
    auto dir = opendir(dirToOpen.c_str());

    //set the new path for the content of the directory
    path = dirToOpen + "/";

    std::cout << "Process directory: " << dirToOpen.c_str() << std::endl;

    if(NULL == dir)
    {
        std::cout << "could not open directory: " << dirToOpen.c_str() << std::endl;
        return;
    }

    auto entity = readdir(dir);

    while(entity != NULL)
    {
        ProcessEntity(entity);
        entity = readdir(dir);
    }

    //we finished with the directory so remove it from the path
    path.resize(path.length() - 1 - directory.length());
    closedir(dir);
}

void ProcessEntity(struct dirent* entity)
{
    //find entity type
    if(entity->d_type == DT_DIR)
    {//it's an direcotry
        //don't process the  '..' and the '.' directories
        if(entity->d_name[0] == '.')
        {
            return;
        }

        //it's an directory so process it
        ProcessDirectory(std::string(entity->d_name));
        return;
    }

    if(entity->d_type == DT_REG)
    {//regular file
        ProcessFile(std::string(entity->d_name));
        return;
    }

    //there are some other types
    //read here http://linux.die.net/man/3/readdir
    std::cout << "Not a file or directory: " << entity->d_name << std::endl;
}

void ProcessFile(std::string file)
{
    std::cout << "Process file     : " << fileToOpen.c_str() << std::endl;

    //if you want to do something with the file add your code here
}

答案 1 :(得分:3)

答案 2 :(得分:2)

递归是不必要的。 Linux上有一个工具可以迭代执行此操作。

#include <ftw.h>

int ftw(const char *dirpath,
        int (*fn) (const char *fpath, const struct stat *sb,
                   int typeflag),
        int nopenfd);

ftw()函数为给定树中的每个文件和目录调用提供的回调。

答案 3 :(得分:1)

除了Dmitri's answer之外,您可能还有兴趣使用nftw库函数&#34;为您做递归&#34;

答案 4 :(得分:1)

使用nftw。它提供了各种选项来微调目录遍历。

该页面还会显示an example

答案 5 :(得分:0)

列表目录的答案只是答案的第一部分,但我没有看到有人回答递归部分。要递归地执行任何操作,你必须创建一个“调用自身”的子程序 - 请注意在处理符号链接时应该小心,特别是在使用nfs时的/ exports这样的情况下,这可能会导致循环递归并锁定你的infinte环!基本上是:

这不是真正的代码,它的伪代码试图帮助您获得更好的主意 如何递归工作,而不会混淆你的语言这个想法可以 应用于任何具有某种呼叫返回机制的语言 这几天几乎是我能想到的每种语言

// PSEUDO-CODE
stiring entriesarray[] myfunc(string basedir)
{
  string results[] = getfilesandfolders(basedir) // you might want to specify a filter
  for each string entry in results
  {
        // if you want only files you'll need to test for if entry is a file
       entriesarray.add(entry)
       if (entry is a directory && entries is not a symbolic link)
       {
            string moreentriesarray[] = myfunc(entry)
            entriesarray.join(moreentriesarray)
       }
  }
  return entriesarray[]
}

注意如果条目不包含任何真实目录,该函数不会调用自身?这很重要,因为这是避免无限递归的方式。但是要注意你可能想要这样做,这样可以取消这个操作,更大的文件系统 这些天可能需要花费大量时间来处理。我通常这样做的方式是开始另一个 线程并在后台进行搜索,并让后台线程检查 如果用户想要停止操作,则取消标志,因此它可以发布关于剩余时间,完成百分比等的信息。它有点粗糙但是 这应该让任何对这类事情感兴趣的人朝着正确的方向前进。和 记住要始终正确检查错误并进行异常处理,这是事情 我看到新程序员一直在跳过。