无论如何要获取特定目录中的文件总数而不是迭代 readdir(3)?
我的意思是仅特定目录的直接成员。
似乎获取文件数量的唯一方法是重复调用 readdir(3) 直到它返回零。
有没有其他方法可以得到 O(1) 中的数字?我需要一个适用于 Linux 的解决方案。
谢谢。
我认为在 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 轻松获取文件数量。
顺便说一句,这是一个非常有趣的问题。所以我投了赞成票。
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);
在shell脚本中它非常简单
ll directory_path | wc -l