LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 857|回复: 7

文件夹遍历程序的小问题Too many open files

[复制链接]
发表于 2007-5-23 16:24:16 | 显示全部楼层 |阅读模式
static int GetAllFile(const char *path_name)  
{  
        struct stat statbuf;
        DIR *dirp;  
        struct dirent *direntp;

        if((dirp = opendir(path_name)) == NULL)  
        {  
                printf("Open Directory %s Error:%s\n", path_name,strerror(errno));  
                //exit(1);  
        }  
         
        while((direntp = readdir(dirp))! = NULL)
        {                
                if(lstat(direntp->d_name,&statbuf) == -1)  
                {  
                        printf("Get stat on %s Error:%s\n", direntp->d_name, strerror(errno));  
                        closedir(dirp);
                        //return(-1);  
                }  
         
                if(S_ISDIR(statbuf.st_mode))
                {
                        GetAllFile(direntp->d_name);
                        //return(1);
                }
                if(S_ISREG(statbuf.st_mode))  
                        printf("%s size:%ld bytes\tmodified at %s", direntp->d_name, statbuf.st_size,ctime(&statbuf.st_mtime));  
        }
       
        return(0);  
}

Open Directory . Error:Too many open files
段错误
//有劳高手看看
发表于 2007-5-23 17:04:12 | 显示全部楼层
把不用的文件都关了吧
回复 支持 反对

使用道具 举报

发表于 2007-5-23 18:23:57 | 显示全部楼层
看起来似乎是 closedir 放错地方了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-24 09:28:54 | 显示全部楼层
Post by x11
看起来似乎是 closedir 放错地方了


如果兄台有空,可不可以告诉我应该放哪里呢
回复 支持 反对

使用道具 举报

发表于 2007-5-24 11:05:08 | 显示全部楼层
man nftw

--file tree walk, 遍历文件夹用这个函数不就可以了么?干嘛要自己来写阿,作为练习倒还行。
回复 支持 反对

使用道具 举报

发表于 2007-5-24 11:22:57 | 显示全部楼层
  1. if((dirp = opendir(path_name)) == NULL)
  2. {
  3. printf("Open Directory %s Error:%s\n", path_name,strerror(errno));
  4. //exit(1);
  5. }
复制代码

大哥,先不谈closedir应该放哪儿,你这个地方不是打印个出错信息就OK了啊!把exit注释掉就不管了?至少放个return在这儿吧。
后面还有一样的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-24 12:09:37 | 显示全部楼层
void   check_dir(char*   dirname)   
{   
    DIR*   p;   
    struct   dirent*   dirlist;   
    struct   stat   filestat;   
    char   indir[1024];   
      
    p = opendir(dirname);
    if (p == NULL)
    {
            err_msg("opendir");
            return;
    }          
    while((dirlist = readdir(p))!= NULL)   
    {   
        sprintf(indir,"%s/%s",dirname,dirlist->d_name);   
        stat(indir,&filestat);   
        if(S_ISREG(filestat.st_mode))   
        {   
            printf("%s\n",indir);   
        }   
        else   
        {   
            if(S_ISDIR(filestat.st_mode)&&dirlist->d_name[0]!= '.')   
            {   
                check_dir(indir);   
            }   
        }   
    }
    closedir(p);   
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-24 12:10:18 | 显示全部楼层
这个函数OK了,多谢楼上几位
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表