#include<dirent.h>
#include<limits.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>#define FTW_F        1        //标记非目录文件
#define FTW_D        2        //标记目录文件
#define FTW_DNR        3        //标记不可读目录
#define FTW_NS        4        //标记不可获得stat的文件static char *fullpath;        //保存文件的全路径
static size_t pathlen;        //保存文件的路径长度//定义处理文件的函数
typedef int Myfunc(const char *,const struct stat*,int);
static Myfunc myfunc;
static int myftw(char *,Myfunc *);
static int dopath(Myfunc *);
char *path_alloc(size_t *size_t);/*
nreg:普通文件的个数;    ndir: 目录文件的数量;    nblk:块特殊文件的数量
nchr:字符特殊文件的数量    nfifo:管道特殊文件的数量
nslink:符号连接特殊文件的数量;    nsock:套接字文件数量; ntot:总文件数量
*/
static long nreg,ndir,nblk,nchr,nfifo,nslink,nsock,ntot;int main( int argc, char *argv[])
{int ret;if(argc != 2){printf("falut command input !\n");exit(1);}//计算各类文件的个数ret = myftw(argv[1],myfunc);ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;//避免除以0if(ntot == 0){ntot = 1;}printf("regular files = %7ld,%5.2f %%\n",nreg,nreg*100.0 / ntot);printf("direciotn files = %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("sockers  = %7ld,%5.2f %%\n",nsock,nsock*100.0 / ntot);}//处理pathname并保存在一个全局的字符数组中,调用dopath
static int myftw(char *pathname,Myfunc *func)
{//为保存路径的字符串数组分配空间fullpath = path_alloc(&pathlen);//如果分配内存空间不够就重新分配if(pathlen <= strlen(pathname)){pathlen = strlen(pathname) * 2;if((fullpath = realloc(fullpath,pathlen )) == NULL);printf("realloc failed\n");}//将路径名参数保存到全路径中,fullpath是全局变量,dopath函数可以调用
    strcpy(fullpath,pathname);return (dopath(func));
}//路径数组分配
char *path_alloc(size_t *size)
{char *p = NULL;if(!size)return NULL;p = malloc(256);if(p)*size = 256;else*size = 0;return p;
}//dopath用于判断是否是目录,然后根据选择情况是直接进入myfun函数取技术
//还是递归调用dopath函数
static int dopath(Myfunc *func)
{struct stat        statbuf;struct dirent    *dirp;DIR             *dp;int             ret,n;//调用lstat获取路径名的stat信息,如果不成功,调用func函数,并传递给FTW_NSif(lstat(fullpath,&statbuf) < 0)return (func(fullpath, &statbuf, FTW_NS));//查看文件stat结构的st_mode,如果不是目录,调用func函数 //并传递给FTW_F,交由myfun进一步判断文件类型 if(S_ISDIR(statbuf.st_mode) == 0)return(func(fullpath,&statbuf,FTW_F));//最后一种情况就是该路径名代表的是一个目录,此次的fun的正常情况返回0//所以执行完func后还不会返回,会继续执行funcif((ret = func(fullpath,&statbuf,FTW_D)) != 0)return(ret);//路径处理,扩充路径空间长度n = strlen(fullpath);if(n + NAME_MAX + 2 > pathlen){pathlen *= 2;if((fullpath = realloc(fullpath,pathlen)) == NULL){printf("realoc failed\n");}}fullpath[n++] = '/';fullpath[n] = 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(&fullpath[n],dirp->d_name); //在“/”之后加上当前目录项的命中if((ret = dopath(func)) != 0) //然后采用新的路径名递递归的调用dopathbreak;}fullpath[n-1] = 0;//关闭目录if(closedir(dp) < 0 )printf("can't close directory %s",fullpath);return ret;}//通过stat结构的st_mode字段来判断文件的类型,并计数
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:    printf("for S_IFDIR for %s",pathname);}break;//对于目录文件进行处理case FTW_D:ndir++;break;//对于不可读目录进行处理case FTW_DNR:printf("%s dir isn't read",pathname);break;case FTW_NS:printf("%s stat error",pathname);default:printf("%d type aren't identified, path is %s",type,pathname);}return 0;
}

转载于:https://www.cnblogs.com/wanghao-boke/p/11608159.html

C语言实现文件类型统计函数相关推荐

  1. C语言实现文件类型统计程序,C语言实现文件类型统计函数

    #include#include#include#include#include#include#include #define FTW_F 1 //标记非目录文件 #define FTW_D 2 / ...

  2. python语言源程序文件类型_浅谈Python的文件类型

    Python的文件类型主要分为3种:源代码(source file).字节码(byte-code file).优化的字节码(optimized file).这些代码都可以直接运行,不需要编译或者连接. ...

  3. python语言源程序文件类型_Python语言源程序文件的文件类型是__________。

    [单选题]Do you know Li Ming? No, I don't know _____. [填空题]从同步.异步方式的角度讲,82C55的基本输入/输出方式属于 通讯 . [判断题]扩展I/ ...

  4. c语言中文件类型只有6,C语言中的文件类型只有哪两种

    C语言中的文件类型只有ASCII文件和二进制文件两种.ASCII码文件通常用于存放输入数据及程序的最终结果:二进制文件用于暂存程序的中间结果,供另一段程序读取. C语言中的文件类型只有ASCII文件和 ...

  5. c语言中的文件类型只有文本文件一种,C语言中的文件类型只有哪两种_后端开发...

    pycharm能干嘛_后端开发 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示 ...

  6. C语言文件操作——数据文件类型、文件判断、文件缓冲区详解

    之前,我讲解了文件操作的三大步骤,讲解了文件读写的各类函数和使用方法,今天,还是来和大家聊一聊文件操作剩余的一些知识点. 一.数据文件类型 之前我讲到过文件按照功能类型分为程序文件和数据文件两大类,我 ...

  7. c语言工程文文件作用是什么,ccs工程文件类型和作用

    ccs工程文件类型和作用 [复制链接] 本帖最后由 Jacktang 于 2018-8-19 22:20 编辑 CCS建立一个完整的工程,至少需要以下4个文件:存储器分配cmd文件.C语言系统库rts ...

  8. C语言文件类型和打开,关闭文件

    文件类型 读取文件需要文件信息(读写位置,内存缓冲地址....),这些信息放在"文件信息区". 由系统定义的FILE结构体类型可对其进行描述,定义在头文件stdio.h中. 可使用 ...

  9. Tableau实战系列浏览 Tableau 环境(八) -tableau文件类型、语言和区域设置以及图标

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

最新文章

  1. 用C语言解“求整数段和”题
  2. stm32跑python-STM32F4系列使用MicroPython开发
  3. python 读取txt文件为字典_python将txt文件读取为字典的示例
  4. WIN10 查看已经连接的wifi的密码
  5. 大神演示win10系统语音识别应用的详细教程
  6. 早晚我要把它们都干掉!!!!!!!
  7. 鸟哥的 Linux 私房菜13-- 学习 BASH Shell 咯
  8. 麦子学院bootstrap实战项目官网,后台,jquery.singlePageNav.min.js ,wow.min.js,animate.css使用...
  9. Python3.7安装numpy与scipy库(win10)
  10. 人脸检测-人脸对齐-人脸识别原理及方法
  11. 小于n的最大素数python_求m下n个最大素数
  12. 【NGUI】实现半圆形进度条,技能CD效果
  13. 学习笔记4--自动驾驶汽车感知系统
  14. colormap保存 matlab_[转载]matlab的colormap的保存
  15. matlab等于怎么表示,MATLAB里的不等于用什么表示?
  16. CountDownTimer 一步实现最简单的倒计时控件
  17. Xilinx 7系列FPGA之Virtex-7产品简介
  18. leetcode刷题记录2:进度64, 2021.10.23
  19. 借助海尔平台打造智能家居的一点想法
  20. 图形引擎实战:移动平台海飞丝系统-运动篇

热门文章

  1. sublime text3 使用SVN插件
  2. TClientDataSet使用要点
  3. 求根号m(巴比伦算法)
  4. 转:JNI jstring与c++字符串类型转换函数
  5. 关于varchar2在pl/sql和schema级别的最大值
  6. java 泛型嵌套泛型_Java泛型嵌套
  7. ajax 浏览器后退,全站Ajax浏览器后退方法
  8. 计算机硬件系统一直延用,会计从业资格证考试:会计电算化计算机硬件系统
  9. python安装包找不到setup_如何安装没有setup.py的Python模块?
  10. java中如何调用dal接口案例_关于Java:接口的目的