1

私の目標は、ディレクトリ内のファイルの数を数えることです。調べてみると、ディレクトリ内の各ファイルを反復処理するコードが見つかりました。しかし、問題は、それが余分な時間をループしていることです。より正確には、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]ましたが、それも役に立ちませんでした。

4

2 に答える 2

1

コメントで指摘されているように、 と という名前の 2 つのディレクトリも取得しているため...カウントが歪んでいます。

Linux では、のd_typeフィールドを使用struct direntしてそれらを除外できますが、ドキュメントには次のように記載されています。

POSIX.1 によって義務付けられている dirent 構造体の唯一のフィールドは次のとおりd_name[]ですNAME_MAX。および (XSI 拡張機能として) d_ino. 他のフィールドは標準化されておらず、すべてのシステムに存在するわけではありません。詳細については、以下の注を参照してください。

したがって、Windows を使用していると仮定すると、おそらくd_type. 次に、代わりに他の呼び出しを使用できますstat()。もちろん、名前に基づいて除外することもできますが、とにかくディレクトリをスキップしたい場合は、より堅牢で一般的なソリューションです。

于 2013-02-20T08:45:43.177 に答える
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 */
  }
}
于 2013-02-20T09:02:10.463 に答える