我的目标是计算目录中的文件数。在搜索之后,我找到了一段代码,它遍历目录中的每个文件。但问题是,它会循环额外的时间,2倍以上更精确。
所以
int main(void)
{
DIR *d;
struct dirent *dir;
char *ary[10000];
char fullpath[256];
d = opendir("D:\\frames\\");
if (d)
{
int count = 1;
while ((dir = readdir(d)) != NULL)
{
snprintf(fullpath, sizeof(fullpath), "%s%d%s", "D:\\frames\\", count, ".jpg");
int fs = fsize(fullpath);
printf("%s\t%d\n", fullpath, fs); // using this line just for output purposes
count++;
}
closedir(d);
}
getchar();
return(0);
}
我的文件夹包含500个文件,但输出显示为502
我将代码修改为
struct stat buf;
if ( S_ISREG(buf.st_mode) ) // <-- I'm assuming this says "if it is a file"
{
snprintf(fullpath, sizeof(fullpath), "%s%d%s", "D:\\frames\\", count, ".jpg");
int fs = fsize(fullpath);
printf("%s\t%d\n", fullpath, fs);
}
但我得到了storage size of "buf" isn't known
。我也尝试过做struct stat buf[100]
,但这也无济于事。
答案 0 :(得分:1)
正如评论中所指出的那样,您还获得了名为.
和..
的两个目录,这会使您的计数出现偏差。
在Linux中,您可以使用d_type
的{{1}}字段对其进行过滤,但文档说明:
POSIX.1强制要求的dirent结构中的唯一字段是:
struct dirent
,未指定大小,在终止空字节之前最多有d_name[]
个字符;和(作为XSI扩展名)NAME_MAX
。其他字段是非标准化的,并不存在于所有系统中;请参阅下面的注释以获取更多详细信息。
因此,假设您使用的是Windows,则可能没有d_ino
。然后你可以使用其他一些调用,例如stat()
。您当然可以根据名称过滤掉,但如果您想跳过目录,那么这是一个更强大和通用的解决方案。
答案 1 :(得分:0)
您需要在您想要信息的文件名上拨打_stat()
/ stat()
。
#include <sys/types.h>
#include <sys/stat.h>
#ifdef WINDOWS
# define STAT _stat
#else
# define STAT stat
#endif
...
char * filename = ... /* let it point to some file's name */
struct STAT buffer = {0};
if (STAT(filename, &buffer)
... /* error */
else
{
if (S_ISREG(buffer.st_mode))
{
... /* getting here, means `filename` referrs to a ordinary file */
}
}