linux c学习笔记----目录文件的操作(opendir,readdir,closedir)

http://lobert.iteye.com/blog/1706165


注:为什么要说目录文件?其实在linux中目录也是一种文件,只是它的内容是上级的目录和当前目录下的文件信息等,详情可以看看相关深入的书籍

 

opendir(打开目录)

 
相关函数open,readdir,closedir,rewinddir,seekdir,telldir,scandir
表头文件#include<sys/types.h>
#include<dirent.h>
定义函数DIR * opendir(const char * name);
函数说明opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。
返回值成功则返回DIR* 型态的目录流,打开失败则返回NULL。
错误代码EACCESS 权限不足
EMFILE 已达到进程可同时打开的文件数上限。
ENFILE 已达到系统可同时打开的文件数上限。
ENOTDIR 参数name非真正的目录
ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。
ENOMEM 核心内存不足。

 

readdir(读取目录)

 

相关函数open,opendir,closedir,rewinddir,seekdir,telldir,scandir
表头文件#include<sys/types.h>
#include<dirent.h>
定义函数struct dirent * readdir(DIR * dir);
函数说明readdir()返回参数dir目录流的下个目录进入点。
结构dirent定义如下
struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256;
};
d_ino 此目录进入点的inode
d_off 目录文件开头至此目录进入点的位移
d_reclen _name的长度,不包含NULL字符
d_type d_name 所指的文件类型
d_name 文件名
返回值成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。
附加说明EBADF参数dir为无效的目录流。

 

closedir(关闭目录)

 
相关函数opendir
表头文件#include<sys/types.h>
#include<dirent.h>
定义函数int closedir(DIR *dir);
函数说明closedir()关闭参数dir所指的目录流。
返回值关闭成功则返回0,失败返回-1,错误原因存于errno 中。
错误代码EBADF 参数dir为无效的目录流
范例参考readir()。

 

下面我们开发一个小程序,这个程序有一个参数.如果这个参数是一个文件名,我们输出这

个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和

修改时间.

 

C代码   收藏代码
  1. #include <unistd.h>  
  2. #include <stdio.h>  
  3. #include <errno.h>  
  4. #include <sys/types.h>  
  5. #include <sys/stat.h>  
  6. #include <dirent.h>  
  7. #include <time.h>  
  8.   
  9. static int get_file_size_time(const char *filename) {  
  10.     struct stat statbuf;  
  11.     if (stat(filename, &statbuf) == -1) {  
  12.         printf("Get stat on %s Error:%s\n",  
  13.                 filename, strerror(errno));  
  14.         return (-1);  
  15.     }  
  16.     if (S_ISDIR(statbuf.st_mode))return (1);  
  17.     if (S_ISREG(statbuf.st_mode))  
  18.         printf("%s size:%ld bytes\tmodified at %s",  
  19.             filename, statbuf.st_size, ctime(&statbuf.st_mtime));  
  20.     return (0);  
  21. }  
  22.   
  23. int main(int argc, char **argv) {  
  24.     DIR *dirp;  
  25.     struct dirent *direntp;  
  26.     int stats;  
  27.     char buf[80];  
  28.     if (argc != 2) {  
  29.         printf("Usage:%s filename\n\a", argv[0]);  
  30.         exit(1);  
  31.     }  
  32.     if (((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))exit(1);  
  33.     if ((dirp = opendir(argv[1])) == NULL) {  
  34.         printf("Open Directory %s Error:%s\n",  
  35.                 argv[1], strerror(errno));  
  36.         exit(1);  
  37.     }  
  38.     while ((direntp = readdir(dirp)) != NULL){  
  39.         sprintf(buf,"%s/%s",argv[1],direntp->d_name);  
  40.         if (get_file_size_time(buf) == -1)break;  
  41.     }  
  42.     closedir(dirp);  
  43.     exit(1);  
  44. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值