3

无论如何要获取特定目录中的文件总数而不是迭代 readdir(3)?

我的意思是仅特定目录的直接成员。

似乎获取文件数量的唯一方法是重复调用 readdir(3) 直到它返回零。

有没有其他方法可以得到 O(1) 中的数字?我需要一个适用于 Linux 的解决方案。

谢谢。

4

3 回答 3

0

我认为在 O(1) 中是不可能的。想想inode结构。对此没有任何线索。

但是,如果可以获取文件系统中的文件数,则可以使用 statvfs(2)。

#include <sys/vfs.h>    /* or <sys/statfs.h> */
int statfs(const char *path, struct statfs *buf);


struct statfs {
               __SWORD_TYPE f_type;    /* type of file system (see below) */
               __SWORD_TYPE f_bsize;   /* optimal transfer block size */
               fsblkcnt_t   f_blocks;  /* total data blocks in file system */
               fsblkcnt_t   f_bfree;   /* free blocks in fs */
               fsblkcnt_t   f_bavail;  /* free blocks available to
                                          unprivileged user */
               fsfilcnt_t   f_files;   /* total file nodes in file system */
               fsfilcnt_t   f_ffree;   /* free file nodes in fs */
               fsid_t       f_fsid;    /* file system id */
               __SWORD_TYPE f_namelen; /* maximum length of filenames */
               __SWORD_TYPE f_frsize;  /* fragment size (since Linux 2.6) */
               __SWORD_TYPE f_spare[5];
};

您可以通过 f_files - f_ffree 轻松获取文件数量。

顺便说一句,这是一个非常有趣的问题。所以我投了赞成票。

于 2013-06-05T07:02:41.920 回答
0

scandir() 示例,需要dirent.h:

struct dirent **namelist;
int n=scandir(".", &namelist, 0, alphasort);   //  "."  == current directory.
if (n < 0)
{
    perror("scandir");
    exit(1);
}
printf("files found = %d\n", n);
free(namelist);
于 2013-06-05T02:24:17.313 回答
-1

在shell脚本中它非常简单

ll directory_path | wc -l 
于 2013-06-05T07:10:46.903 回答