readdir循环次数比目录中存在的文件数多

时间:2013-02-20 08:23:40

标签: c readdir

我的目标是计算目录中的文件数。在搜索之后,我找到了一段代码,它遍历目录中的每个文件。但问题是,它会循环额外的时间,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 enter image description here

更新

我将代码修改为

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],但这也无济于事。

2 个答案:

答案 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 */
  }
}