首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

两种情况下的S_ISDIR如何得到不同的效果

2012-03-14 
求助:两种情况下的S_ISDIR怎么得到不同的效果?参考了2种遍历目录的写法,怎么大致上一样的写法却得到了不同

求助:两种情况下的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);

就可以了

热点排行