求助:两种情况下的S_ISDIR怎么得到不同的效果?
参考了2种遍历目录的写法,怎么大致上一样的写法却得到了不同的结果?
第一种:不是我想要的结果
int browse_dir(string dir)
{
DIR *pDir;
struct dirent *pEnt;
struct stat statbuf;
string sFileName;
pDir = opendir(dir.c_str());
if (pDir == NULL) {
if (errno == ENOTDIR) {
filenames.push_back(dir);
return 0;
}
perror(dir.c_str());
return -1;
}
while ((pEnt=readdir(pDir))!= NULL)
{
if ((pEnt-> d_name[0]== '. ')&&(pEnt-> d_name[1]== '. ' || pEnt-> d_name[1]==0))
{
continue;
}
lstat(pEnt-> d_name,&statbuf);
if(!S_ISREG(statbuf.st_mode))//执行该代码后,无论是目录还是文件,均为true,所以只会打印出directory-> 。。。的结果,还有 如果把!S_ISREG改为S_ISDIR则把无论什么都会打印出file-> .....
{
sFileName= dir + "/ " + pEnt-> d_name;
printf( "directory-> %s\n ", sFileName.c_str());
// browse_dir(sFileName);
}
else
{
sFileName= dir + "/ "+pEnt-> d_name;
printf( "file-> %s\n ",sFileName.c_str());
}
}
closedir(pDir);
return 0;
}
第2种写法:得到正确的结果
void printdir(char *dir,int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp=opendir(dir))==NULL)
{
fprintf(stderr, "cannot open direntory:%s\n ",dir);
return;
}
chdir(dir);
while((entry=readdir(dp))!=NULL)
{
lstat(entry-> d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode))
{
if(strcmp( ". ",entry-> d_name)==0||strcmp( ".. ",entry-> d_name)==0)
continue;
printf( "%*s%s/\n ",depth, " ",entry-> d_name);
printdir(entry-> d_name,depth+4);
}
else printf( "%*s%s\n ",depth, " ",entry-> d_name);
}
chdir( ".. ");
closedir(dp);
}
请问 第一种写法为什么不行呢?谢谢
[解决办法]
lstat(pEnt-> d_name,&statbuf);
它的问题,你仔细看一下测试的是文件能否直接访问?
sFileName= dir + "/ " + pEnt-> d_name;
lstat( sFileName,&statbuf);
就可以了