打开的文件太多了?它确实打开了我想要的东西(至少我是这么认为),问题是我得到了一个无限循环,而且有太多打开的文件出错了,请给我一点帮助,或指针哪里弄错了?(包括“,”!)
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<sys/types.h>
#include<time.h>
#include<dirent.h>
#include<string.h>
int listdir(const char *nf);
int fileinfo(const char *nf,const char *da){
struct stat s; struct passwd *pp;
if(stat(nf,&s)==-1)return -1;
if((pp=getpwuid(s.st_uid))==NULL)return -1;
if((s.st_mode & S_IFMT) == S_IFDIR) listdir(da);
printf(" %s\n",nf);
return 0;
}
int listdir(const char *nf){
DIR *pd; struct dirent *pde;
char cale[256], specificator[256];
char cale2[256];
if((pd=opendir(nf))==NULL)return -1;
strcpy(cale2,nf);
strcpy(cale, nf); strcat(cale,"/");
while((pde=readdir(pd))!=NULL){
strcpy(specificator, cale); strcat(specificator, pde->d_name);
if(fileinfo(specificator,cale2)==-1)perror(specificator);
}
return 0;
}
int main(int na, char *a[]){
if(na==2)if(listdir(a[1])==-1)perror(a[1]);
return 0;
}
答案 0 :(得分:1)
原因是..
的结果中有.
(父目录)和readdir
(当前目录)。您应该阻止对这两个条目进行递归listdir()
调用
此外,您需要在完成使用后调用closedir
。
以下是您的功能listdir
的快速修复:
int listdir(const char *nf){
DIR *pd; struct dirent *pde;
char cale[256], specificator[256];
char cale2[256];
if((pd=opendir(nf))==NULL)return -1;
strcpy(cale2,nf);
strcpy(cale, nf); strcat(cale,"/");
while((pde=readdir(pd))!=NULL){
if (!strcmp(pde->d_name, ".") || !strcmp(pde->d_name, ".."))
continue;
strcpy(specificator, cale); strcat(specificator, pde->d_name);
if(fileinfo(specificator,cale2)==-1)perror(specificator);
}
closedir(pd);
return 0;
}
另外,请注意,calce/calce2/specificator
中的组合路径名称不会超过256个字节,而且只有d_name
中的struct dirent
通常只有{{1}}。