0

dirent.hで提供される機能を使用して、ファイルを再帰的に開こうとしています。

私の問題は次のとおりです。開くことができなかったディレクトリをスキップできませんでした。失敗して終了するのではなく、できるディレクトリを開き、できないディレクトリをスキップして次のディレクトリに移動するようにします。これを修正するにはどうすればよいですか?

ここに私が使用しようとした簡単なコードがあります

int acessdirs(const char *path)
{
    struct dirent *entry;
    DIR *dp;
    char fpath[300];
    if(dp=opendir(path))
    {
        while((entry=readdir(dp)))
            do things here
    }
    else
    {
        std::cout<<"error opening directory";
        return 0;
    }
    return 1;
}

私はこれと同じスタイルを使用windows 7しましたが、正常に動作します.しかし、それはクラッシュしwindows xp、デバッグすると、"system volume information". このフォルダーにアクセスする必要は本当にありません。スキップする方法があるかどうかを期待していました。

これが私の実際のコードです:

少し長いです。

int listdir(const char *path) 
{
  struct dirent *entry;
  DIR *dp;

  if(dp = opendir(path))
  {
    struct stat buf ;

    while((entry = readdir(dp)))
    {
        std::string p(path);
        p += "\\";
        p += entry->d_name;
         char fpath[300];
        if(!stat(p.c_str(), &buf))
        {
            if(S_ISREG(buf.st_mode))
            {  
                sprintf(fpath,"%s\\%s",path,entry->d_name);
                stat(fpath, &buf);
                std::cout<<"\n Size of \t"<<fpath<<"\t"<<buf.st_size;
                fmd5=MDFile (fpath);        
            }//inner second if
            if(S_ISDIR(buf.st_mode) &&  
         // the following is to ensure we do not dive into directories "." and ".."
                      strcmp(entry->d_name, ".")  && strcmp(entry->d_name, "..") )
            {
                listdir(p.c_str());
            }
        }//inner first if
        else
            std::cout << "ERROR in stat\n";
    }//end while
    closedir(dp);
  }//first if
  else
  {
      std::cout << "ERROR in opendir\n";
      return 0;
  }
  return 1;   

 }//listdir()
4

1 に答える 1

1

あなたの最大の問題はここにあるようです:

sprintf(fpath,"%s\\%s",path,entry->d_name);
stat(fpath, &buf);

の宣言を見ずfpathに、確実に言うのは難しいですが、あなたはどちらかです

  • 呼び出しでオーバーフローfpathし、sprintf未定義の動作につながります。「システムボリューム情報」は長い名前です。本当に使用する必要がありますsnprintf

  • stat呼び出しの戻り値をチェックしません。戻ってきたら-1中身がわかりませんbuf

More importantly, if you can use POSIX stuff, the function ftw is standard, and should provide most of the functionality you're trying to implement here.

于 2012-05-01T02:54:04.030 に答える