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()