当前位置: 技术问答>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);
}
请问 第一种写法为什么不行呢?谢谢
第一种:不是我想要的结果
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);
就可以了
它的问题,你仔细看一下测试的是文件能否直接访问?
sFileName= dir + "/" + pEnt->d_name;
lstat( sFileName,&statbuf);
就可以了