0

我正在处理一个目录列表项目,我需要捕获计算机上的所有文件,然后将它们存储在一个队列中,然后将其发送给工作线程进行工作。

现在我正在使用这个示例代码nftw()

#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

static int
display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)
{
    printf("%-3s %2d %7jd   %-40s %d %s\n",
        (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
        (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
        (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
        (tflag == FTW_SLN) ? "sln" : "???",
        ftwbuf->level, (intmax_t) sb->st_size,
        fpath, ftwbuf->base, fpath + ftwbuf->base);
    return 0;           /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
    int flags = 0;

   if (argc > 2 && strchr(argv[2], 'd') != NULL)
        flags |= FTW_DEPTH;
    if (argc > 2 && strchr(argv[2], 'p') != NULL)
        flags |= FTW_PHYS;

   if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
            == -1) {
        perror("nftw");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

我注意到它开始非常快,然后很快消失,每 1000 个文件循环大约需要 7 秒。我正在寻找一种方法来提高此功能的速度。

4

1 回答 1

3

在您链接的页面中,对此行为有以下解释:

为了避免用完所有调用进程的文件描述符, nopenfd指定了ftw()将同时保持打开的目录的最大数量。当搜索深度超过此值时,ftw() 将变得更慢,因为必须关闭并重新打开目录。 ftw()对目录树中的每一级最多使用一个文件描述符。

于 2020-01-10T17:53:26.927 回答