当前位置:  技术问答>linux和unix

求助:两种情况下的S_ISDIR怎么得到不同的效果?

    来源: 互联网  发布时间:2016-02-03

    本文导语:  参考了2种遍历目录的写法,怎么大致上一样的写法却得到了不同的结果? 第一种:不是我想要的结果 int browse_dir(string dir) {         DIR *pDir;         struct dirent *pEnt;         struct stat statbuf;       ...

参考了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->%sn", sFileName.c_str());
                //  browse_dir(sFileName);
                }
                else
                {
                    sFileName= dir +"/"+pEnt->d_name;
                    printf("file->%sn",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:%sn",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%sn",depth,"",entry->d_name);
}
chdir("..");
closedir(dp);
}

请问 第一种写法为什么不行呢?谢谢

|
lstat(pEnt->d_name,&statbuf);

它的问题,你仔细看一下测试的是文件能否直接访问?
 sFileName= dir + "/" + pEnt->d_name;
 lstat( sFileName,&statbuf);

就可以了

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题
  • 求助:信号 --13 进程中断
  • 求助,安装了红帽子后进不了
  • 新装linux求助
  • linux的 iptables问题求助
  • (高分求助)请问,那里有软件开发的<设计文档>
  • 一个简单的问题,高分求助!!!
  • 紧急求助:Unix下给文件夹重命名用什么命令?谢谢!!!!
  • VJ的一个问题,高分求助,熟悉VJ得请进!
  • 高分求助


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3