




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数1:path_alloc函数为路径名动态地分配空间/*这个跟版本关系很大*/#include apue.h #include #include #ifdef PATH_MAX /*如果定义了路径名的最大长度*/static int pathmax = PATH_MAX; /*将它赋予我们自己定义的变量pathmax*/#else static int pathmax = 0; /*否则该位置0*/#endif /*上面那个if结束*/#define SUSV3 200112L static long posix_version = 0; /* If PATH_MAX is indeterminate, no guarantee this is adequate */ #define PATH_MAX_GUESS 1024 char * path_alloc(int *sizep) /* also return allocated size, if nonnull */ char *ptr; int size; if (posix_version = 0) posix_version = sysconf(_SC_VERSION); if (pathmax = 0) /* first time through */ errno = 0; if (pathmax = pathconf(/, _PC_PATH_MAX) 0)/*PATH_MAX相对路径名的最大字节数,包括null_PC_PATH_MAX*/ if (errno = 0) pathmax = PATH_MAX_GUESS; /* 确认是未决的就使用我们猜测的值 */ else /*errno不为0说明pathconf执行错误*/ err_sys(pathconf error for _PC_PATH_MAX); else pathmax+; /* 没有/说明是根目录,它也有一个路径 */ if (posix_version SUSV3) /*size和版本有关*/ size = pathmax + 1; else size = pathmax; if (ptr = malloc(size) = NULL) /*分配空间失败则返回空指针*/ err_sys(malloc error for pathname); if (sizep != NULL) *sizep = size; /*如果传入的参数不是null,说明它需要分配空间,把size分给它*/return(ptr); /*返回这段空间的首地址指针*/ 递归降序遍历目录层次结构,并按文件类型计数#include#include#include#include#includeourhdr.htypedefintMyfunc(const char *, const struct stat *, int);/* function type thats called for each filename */static Myfuncmyfunc;static intmyftw(char *, Myfunc *);static intdopath(Myfunc *);static longnreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;intmain(int argc, char *argv)intret;if (argc != 2) /*输入的参数个数不为2,提醒输入的格式*/err_quit(usage: ftw );ret = myftw(argv1, myfunc);/* 解析整个完整的路径 */if ( (ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock) = 0) /*一个文件也没有,这个类每个都是0*/ntot = 1; /*特殊技巧,分母为0,置1也无妨,只要非0即可 0/1=0*/printf(regular files = %7ld, %5.2f %n, nreg, nreg*100.0/ntot);printf(directories = %7ld, %5.2f %n, ndir, ndir*100.0/ntot);printf(block special = %7ld, %5.2f %n, nblk, nblk*100.0/ntot);printf(char special = %7ld, %5.2f %n, nchr, nchr*100.0/ntot);printf(FIFOs = %7ld, %5.2f %n, nfifo, nfifo*100.0/ntot);printf(symbolic links = %7ld, %5.2f %n, nslink,nslink*100.0/ntot);printf(sockets = %7ld, %5.2f %n, nsock, nsock*100.0/ntot);exit(ret);/* * Descend through the hierarchy, starting at pathname. * The callers func() is called for every file. */#defineFTW_F1/* 不是目录的文件 */#defineFTW_D2/* 目录*/#defineFTW_DNR3/* 不可以读的文件 */#defineFTW_NS4/* 不能被stat的文件 */static char*fullpath; /* 包含每个文件的完整路径名 */static int /* 我们返回任何func()函数返回的*/myftw(char *pathname, Myfunc *func)fullpath = path_alloc(NULL);/这里采用默认的path_alloc大小*/*这里调用path_alloc函数,所以要gcc 2.c error.c path_alloc.c -o 2*/strcpy(fullpath, pathname); /不用像课本那样,strcpy自动在结束的位置补上/n /* 为fullpath变量初始化 */ return(dopath(func);/* * 通过层次进行下降操作,我们从全路径开始 * 如果是一个绝对的路径而非一个目录,我们调用lstat函数 * call func(), and return. For a directory, we call ourself * recursively for each name in the directory. */static int dopath(Myfunc* func)struct statstatbuf; /*statbuf是stat结构体的实例*/struct dirent*dirp; /*为获取文件夹目录所用的结构体*/DIR*dp; /*与目录有关的指针*/intret;char*ptr; /*保存要显示的字符串*/if (lstat(fullpath, &statbuf) d_name, .) = 0 | strcmp(dirp-d_name, .) = 0)continue; /*忽略.和.*/strcpy(ptr, dirp-d_name);/* append name after slash */if ( (ret = dopath(func) != 0)/* recursive */break;/* time to leave */ptr-1 = 0;/* erase everything from slash onwards */if (closedir(dp) 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);/* directories should have type = FTW_D */break;case FTW_D:ndir+;break;case FTW_DNR:err_ret(cant 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);3. lstat函数int lstat(const char *pathname, struct stat *buf); 文件类型用中说明的文件类型宏测试S_ISREG(mode) = 1正规文件(S_IFREG)S_ISDIR(mode) = 1目录文件(S_IFDIR)S_ISCHR(mode) = 1字符特殊文件(S_IFCHR)S_ISBLK(mode) = 1块特殊文件(S_IFBLK)S_ISFIFO(mode) = 1管道或FIFO文件(S_IFFIFO)S_ISLNK(mode) = 1符号链接(S_IFLNK)S_ISSOCK(mode) = 1套接口(S_IFSOCK)针对每个命令参数打印其文件类型#include#include#includeourhdr.hint main(int argc, char *argv)inti;struct statbuf;char*ptr;for (i = 1; i argc; i+) printf(%s: , argvi);if (lstat(argvi, &buf) 0) err_ret(lstat error);continue;if (S_ISREG(buf.st_mode)ptr = regular;else if (S_ISDIR(buf.st_mode)ptr = directory;else if (S_ISCHR(buf.st_mode)ptr = character special);else if (S_ISBLK(buf.st_mode)ptr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国排气风扇市场调查研究报告
- 2025年中国手动集线箱市场调查研究报告
- 2025年中国强力抗裂接缝纸带数据监测研究报告
- 2025年中国夹纱布胶板市场调查研究报告
- 2025年中国新能源车行业市场深度分析及投资策略咨询报告
- 2025-2030年中国清洗机圆盘刷行业深度研究分析报告
- 薛雪文化传承创新-洞察阐释
- 2025年中国有机玻璃台历架行业市场发展前景及发展趋势与投资战略研究报告
- 2025年中国分体式双管筒灯行业市场发展前景及发展趋势与投资战略研究报告
- 资源隔离与共享技术-洞察阐释
- 大疆无人机内部管理制度
- 2025长沙市辅警考试试卷真题带答案
- 胸痛健康教育课件
- 2025年合肥城建发展股份有限公司及所属子公司招聘17人(二批次)笔试参考题库附带答案详解
- 2025年项目终止协议
- 医院员工手册管理制度
- 泉州水务集团有限公司招聘考试真题2024
- 东航客运岗位面试题目及答案
- 三级营养师考试复习重点题(附答案)
- 2025装配式混凝土居住建筑首个标准层段联合验收规程
- 2025年人教版小学数学三年级下册期末考试卷(带答案)
评论
0/150
提交评论