本章主要介绍的是文件结构及目录。重点是通过stat函数获取文件的结构信息,然后是文件目录及其遍历。学完本章后,编写了一个输出给的目录下的文件信息的程序。

首先是包含在<sys/stat.h>文件下的stat、fstat、lstat三个函数,三个函数的原型如下:

int stat(const char *path, struct stat *buf);
int fstat(int
fd, struct stat *buf);
int lstat(const char *
path, struct stat *buf);

三个函数的返回值:成功返回0,出错返回-1。

三个函数的区别如下:

stat() stats the file pointed to by path and fills in buf.

lstat() is identical to stat(), except that if path is a symbolic link, then the link itself is stat-ed, not the file that it refers to.

fstat() is identical to stat(), except that the file to be stat-ed is specified by the file descriptor fd.

第二个参数buf是个指针,指向一个文件的具体信息。

struct stat {
    dev_t         st_dev;     /* ID of device containing file */
    ino_t          st_ino;     /* inode number */
    mode_t      st_mode;    /* protection */
    nlink_t       st_nlink;   /* number of hard links */
    uid_t         st_uid;     /* user ID of owner */
    gid_t         st_gid;     /* group ID of owner */
    dev_t        st_rdev;    /* device ID (if special file) */
    off_t          st_size;    /* total size, in bytes */
    blksize_t      st_blksize; /* blocksize for file system I/O */
    blkcnt_t     st_blocks;  /* number of 512B blocks allocated */
    time_t       st_atime;   /* time of last access */
    time_t       st_mtime;   /* time of last modification */
    time_t       st_ctime;   /* time of last status change */
};

Unix下的文件类型有:普通文件(regular file),目录文件(directory file),块特殊文件(block special file),字符特殊文件(character special file),FIFO,套接字(socket),符号链接(symbolic link)。

通过stat系类函数可以判断一个文件是否存在,获取文件的相关信息,例如文件类型、文件长度。

Unix中只有内核才能写目录,对某个目录具有访问权限的任一个用户都可以读该目录。

在头文件<dirent.h>中,提供有一系类目录操作函数。

DIR *opendir(const char *name);

struct dirent *readdir(DIR *dirp);

void rewinddir(DIR *dirp);

int closedir(DIR *dirp);

dirent结构如下:

struct dirent {
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                                   by all file system types */
    char           d_name[256]; /* filename */
};

现在写个小程序,巩固函数的运用。程序的功能是:给定一个目录,输出该目录下所有目录及文件信息。程序如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/stat.h>
 5 #include <dirent.h>
 6 #include <string.h>  7 #include <errno.h>  8  9 void showallfile(char* filepath);

11 int main(int argc,char* argv[]) 12 { 13 if(argc != 2) 14  { 15 printf("Error.Please input filepath.\n"); 16 exit(-1); 17  } 18 //argv[1]中是目录参数 19 showallfile(argv[1]); 20 return 0; 21 } 22 23 void showallfile(char* filepath) 24 { 25 struct stat st; 26 DIR *dp; 27 struct dirent* dirp; 28 char *pstr; 29 //获取文件信息 30 if(lstat(filepath,&st) == -1) 31  { 32 perror("lstat() error"); 33 exit(-1); 34  } 35 //判断文件是否是目录文件 36 if(S_ISDIR(st.st_mode) == 0) //不是 37 printf("File: %s\n",filepath); 38 else //是目录文件,需要进行读目录操作 39  { 40 printf("Directory: %s\n",filepath); 41 pstr = filepath+strlen(filepath); 42 *pstr++ = '/'; 43 *pstr = 0; 44 //打开目录 45 if((dp = opendir(filepath)) == NULL) 46  { 47 printf("opendir() error"); 48 exit(-1); 49  } 50 //读取该目录下的内容 51 while((dirp=readdir(dp))!= NULL) 52  { 53 if(strcmp(dirp->d_name,".") == 0 ||strcmp(dirp->d_name,"..") == 0) 54 continue; 55 strcpy(pstr,dirp->d_name); 56 //递归调用 57  showallfile(filepath); 58  } 59  } 60 }

程序测试结果:

输出 /home/anker/Programs目录下面所有的文件。

参考资料:http://linux.die.net/

转载于:https://www.cnblogs.com/alantu2018/p/8465954.html

Unix环境高级编程(二)文件和目录相关推荐

  1. unix环境高级编程(上)-文件篇

    目录 前言 unix基础知识 unix标准化和实现 unix提供的文件IO 文件和目录 标准IO 系统数据文件 前言 笔者将<unix环境高级编程>主要内容总结为三篇:文件篇,进程篇,高级 ...

  2. Unix环境高级编程(一)文件I/O

    Unix系统中大多数文件I/O只需用到五个函数:open.read.write.lseek.close.本章说介绍的I/O是不带缓冲的,即:每个read和write都调用内核中的一个系统调用.不是IS ...

  3. Unix环境高级编程(二十一)数据库函数库

    本章的内容是开发一个简单的.多用户数据库的C函数库.调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录.绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁 ...

  4. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  5. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  7. apue.h头文件(UNIX环境高级编程)

    相信非常多初学<UNIX环境高级编程>的朋友都会遇到一个问题,执行里面的实例(download: http://www.apuebook.com/ )时就出现故障,提示 "错误: ...

  8. UNIX环境高级编程(第三版 源码及编译好的静态库文件)

    UNIX环境高级编程(第三版) 源码 及 库文件 链接: https://pan.baidu.com/s/1tPY17lWNDEbzkOwZaRUUNg 提取码: 1024 复制这段内容后打开百度网盘 ...

  9. 《Unix环境高级编程》学习笔记:从点到面

    以前在课堂上学习过<Unix初级教程(第四版)>,对于Unix有了一点了解.由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本<Unix环境高级编程>便 ...

最新文章

  1. 水晶报表位置公式_高频、实用函数公式,提升您的工作效率!
  2. 【JavaScript基础笔记】模块化、立即执行函数应用、闭包应用
  3. PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!
  4. Linux入门学习(九)
  5. Python序列基本操作(二)
  6. 如何简单粗暴地上手 TensorFlow 2.0?
  7. java 中的通讯之HTTP协议
  8. 方维P2P添加富友金账户接口实例
  9. Django Book 2.0 翻译
  10. QtChart使用教程
  11. 2021年终总结,我躺平了?
  12. 安装gms 的拨号盘
  13. 写一个26字母和0-9数字 不同长度组合的输出
  14. 《鸟哥的Linux私房菜》chapter9 20180818~20180826
  15. Word目录中自动添加自定义样式的多级标题的方法
  16. 大数据与JS实现2014巴西世界杯冠军预测图
  17. CEC循环生态社区的商业模式瑞波基因XAG
  18. 【GIS】PostGIS使用案例
  19. ffmpeg win10 ffmpeg 采集数据
  20. Arduino简易麦轮小车 使用航模遥控器控制

热门文章

  1. 姑苏行(一) 虎丘山
  2. spring集成testng
  3. IDEA手动安装Scala插件[zt]
  4. chrome扩展推荐:此刻、今天、最近~一个关于时间管理的扩展 - Momentum
  5. 导致页面顶部空白一行解决方法
  6. Android之SwipeRefreshLayout下拉刷新组件
  7. 增强SEO的div+css命名规则
  8. openssl构建CA认证
  9. 使用lvs实现负载均衡(V2.0)
  10. 案例研究 路由器到路由器EOMPLS---基于端口