首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

上面是递归降序遍历目录层次结构,求高手帮忙详细解释一上

2013-01-20 
下面是递归降序遍历目录层次结构,求高手帮忙详细解释一下,#include apue.h#include dirent.h#include

下面是递归降序遍历目录层次结构,求高手帮忙详细解释一下,
#include "apue.h"
#include <dirent.h>
#include <limits.h>

typedef int Myfunc(const char *,const struct stat *,int);//这里是怎么回事了,

static Myfunc myfunc;//这里也是???
static int myftw(char *,Myfunc *);
static int dopath(Myfunc *);
char *path_alloc(int *);//为路径名动态分配内存

static long nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot;

int main(int argc,char *argv[])
{
int ret;
if(argc!=2)
err_quit("usage: ftw <starting-pathname>");

ret = myftw(argv[1],myfunc);
ntot=nreg+ndir+nblk+nchr+nfifo+nslink+nsock;
if(ntot==0)
ntot=1;
printf("regular    = %7ld, %5.2f %%\n",nreg,nreg*100.0/ntot);
printf("directory  = %7ld, %5.2f %%\n",ndir,ndir*100.0/ntot);
printf("block      = %7ld, %5.2f %%\n",nblk,nblk*100.0/ntot);
printf("char       = %7ld, %5.2f %%\n",nchr,nchr*100.0/ntot);
printf("FIFO       = %7ld, %5.2f %%\n",nfifo,nfifo*100.0/ntot);
printf("symbolic   = %7ld, %5.2f %%\n",nslink,nslink*100.0/ntot);
printf("sockets    = %7ld, %5.2f %%\n",nsock,nsock*100.0/ntot);
exit(ret);
}
#define FTW_F 1
#define FTW_D 2
#define FTW_DNR 3
#define FTW_NS 4

static char *fullpath;

static int myftw(char *pathname,Myfunc *func)//这个函数帮忙解释一下?????
{
int len;
fullpath = path_alloc(&len);
strncpy(fullpath,pathname,len);
fullpath[len-1]=0;

return (dopath(func));
}

static int dopath(Myfunc *func)
{
struct stat statbuf;
struct dirent *dirp;
DIR *dp;
int ret;
char *ptr;

if(lstat(fullpath,&statbuf)<0)
return (func(fullpath,&statbuf,FTW_NS));
if(S_ISDIR(statbuf.st_mode)==0)
return (func(fullpath,&statbuf,FTW_F));
if((ret=func(fullpath,&statbuf,FTW_D))!=0)//这里帮忙解释一下
return ret;

ptr=fullpath + strlen(fullpath);//??????????????
*ptr++='/';
*ptr=0;

if((dp=opendir(fullpath))==NULL)
return (func(fullpath,&statbuf,FTW_DNR));
while((dirp=readdir(dp))!=NULL){
if(strcmp(dirp->d_name,".")==0 ||strcmp(dirp->d_name,"..")==0)
continue;
strcpy(ptr,dirp->d_name);
if((ret=dopath(func))!=0)//这里递归
break;
}
ptr[-1]=0;//??????
if(closedir(dp)<0)
err_ret("can not close directory %s",fullpath);
return ret;
}


static int myfunc(const char *pathname,const struct stat *statptr,int type)
{
switch(type){
case FTW_F:
switch(statptr->st_mode & S_IFMT){
case S_IFREG:nreg++;break;
case S_IFBLK:nblk++;break;
case S_IFCHR:nchr++;break;
case S_IFIFO:nfifo++;break;
case S_IFLNK:nslink++;break;
case S_IFSOCK:nsock++;break;
case S_IFDIR:
err_dump("for S_IFDIR for %s",pathname);
}
break;
case FTW_D:
ndir++;
break;
case FTW_DNR:
err_ret("can not read directory %s",pathname);
break;
case FTW_NS:
err_ret("stat error for %s",pathname);


break;
default:
err_dump("unknown type %d for pathname %s",type,pathname);
}
return 0;
}


#include "apue.h"
#include <errno.h>
#include <limits.h>

#ifdef PATH_MAX
static int pathmax=PATH_MAX;
#else
static int pathmax=0;
#endif

#define SUSV3 200112L
static long posix_version=0;
#define PATH_MAX_GUESS 1024

char *path_alloc(int *sizep)
{
char *ptr;
int size;
if(posix_version==0)
posix_version=sysconf(_SC_VERSION);

if(pathmax==0){
errno=0;
if((pathmax=pathconf("/",_PC_PATH_MAX))<0){
if(errno==0)
pathmax=PATH_MAX_GUESS;
else
err_sys("pathconf error for _PC_PATH_MAX");
}else{
pathmax++;
}
}
if(posix_version<SUSV3)
size=pathmax+1;
else
size=pathmax;

if((ptr=malloc(size))==NULL)
err_sys("malloc error pathname");
if(sizep!=NULL)
*sizep=size;

return ptr;
}



[解决办法]
static int myftw(char *pathname,Myfunc *func)
{
int len;
fullpath = path_alloc(&len); // 申请一块儿空间,用来存储传进来的pathname
strncpy(fullpath,pathname,len); // 把pathname复制到新申请的空间内
fullpath[len-1]=0; // 申请的空间内存储字符串,不一定最后一位是空,需要填充0来使字符串结束

return (dopath(func)); 把处理结果返回。
}

热点排行
Bad Request.