已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东汕尾市陆丰市2026-2027学年高三上学期第一次教学质量监测数学试卷(含答案)
- 2026年宁夏回族自治区银川市公务员人员招聘笔试备考试题及答案详解
- 2026年吉林省辽源市公务员人员招聘笔试参考试题及答案详解
- 2025年廊坊市广阳区公务员人员招聘笔试试题及答案详解
- 2026年江西省新余市公务员人员招聘笔试备考题库及答案详解
- 2026年宝鸡市金台区事业单位人员招聘笔试参考题库及答案详解
- 2025年安徽省亳州市事业单位人员招聘笔试试题及答案详解
- 2025-2026学年发现磁铁说课稿
- 2026年沈阳市皇姑区公务员人员招聘考试备考试题及答案详解
- 2025-2026学年大班详细说课稿模板
- 2026植物工厂运营成本构成优化分析
- 教师个人政治思想工作总结(2篇)
- 西学中中医实践技能考试题及答案
- 2026年云南省昆明市辅警考试题库(附答案)
- 布袋除尘器移除施工技术方案
- 2026-2027学年苏教版(新教材)小学科学五年级上册(全册)知识点清单
- 2026年湖南省中考历史试卷(含答案)
- 脊髓疾病诊疗中国指南(2026 版)
- 2026年碳排放核算员职业理论考试题库(完整版)
- 2025年北京高中合格考政治(第一次)试题和答案
- GB/T 11918.2-2025工业用插头、固定式或移动式插座和器具输入插座第2部分:带插销和插套的电器附件的尺寸兼容性要求
评论
0/150
提交评论