文件的描述
/* * File types * * NOTE! These match bits 12..15 of stat.st_mode * (ie "(i_mode >> 12) & 15"). */ #define DT_UNKNOWN 0 #define DT_FIFO 1 //管道 #define DT_CHR 2 //字符设备 #define DT_DIR 4 //目录 #define DT_BLK 6 //块设备 #define DT_REG 8 //普通文件 #define DT_LNK 10 //链接 #define DT_SOCK 12 //套接字 #define DT_WHT 14
这个结构体是用来返回有关目录项的信息的。它包含以下字段:d_ino 是文件序列号,d_off 是目录文件开头到此目录项的偏移量,d_reclen 是此记录的长度,d_name 是以空字符结尾的文件名组件。
struct compat_linux_dirent { compat_ulong_t d_ino; compat_ulong_t d_off; unsigned short d_reclen; char d_name[1]; };
opendir: 打开目录
头文件: sys/types.h dirent.h
函数定义: DIR opendir(const char name);
说明: opendir()用来打开参数 name 指定的目录, 并返回 DIR形态的目录流, 和 open()类似, 接下来对目录的读取和搜索都要使用此返回值. 成功则返回 DIR型态的目录流, 打开失败则返回NULL.
错误代码:
EACCESS 权限不足
EMFILE 已达到进程可同时打开的文件数上限
ENFILE 已达到系统可同时打开的文件数上限
ENOTDIR 参数 name 非真正的目录
ENOENT 参数 name 指定的目录不存在, 或是参数 name 为一空字符串
ENOMEM 核心内存不足
readdir: 读取目录
头文件: sys/types.h 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; char d_name[256]; };
d_ino 此目录进入点的
inode d_off 目录文件开头至此目录进入点的位移
d_reclen _name 的长度, 不包含 NULL 字符
d_type d_name 所指的文件类型
d_name 文件名成功则返回下个目录进入点, 有错误发生或读取到目录文件尾则返回 NULL. EBADF 参数 dir 为无效的目录流
closedir: 关闭目录
头文件: sys/types.h dirent.h
函数定义: int closedir(DIR *dir);
说明: closedir()关闭参数 dir 所指的目录流. 关闭成功则返回 0, 失败返回-1, 错误原因存于errno 中. EBADF 参数 dir 为无效的目录流.
readlink: 取得符号连接所指的文件
头文件: unistd.h
函数定义: int readlink(const char *path, char *buf, size_t bufsize);
说明: readlink()会将参数 path 的符号连接内容存到参数 buf 所指的内存空间, 返回的内容不是以 NULL 作字符串结尾, 但会将字符串的字符数返回. 若参数 bufsiz 小于符号连接的内容长度,过长的内容会被截断. 执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于 errno.
错误代码:
EACCESS 取文件时被拒绝, 权限不够
EINVAL 参数 bufsiz 为负数
EIO I/O 存取错误
ELOOP 欲打开的文件有过多符号连接问题
ENAMETOOLONG 参数 path 的路径名称太长
ENOENT 参数 path 所指定的文件不存在
ENOMEM 核心内存不足
ENOTDIR 参数 path 路径中的目录存在但却非真正的目录
eg
#include <stdio.h> #include <dirent.h> #include <stdlib.h> #include <string.h> #define DIRNAME "/www" #define PHOTO_NUM_MAX 100 int main(int argc,void ** argv) { DIR *dir; struct dirent *dirp; int total_num = 1; if(argc <=1) { printf("input dir\n"); exit(0); } if((dir = opendir(argv[1])) == NULL) //打开图片存放的目录 { perror("fail to opendir"); exit(1); } while((dirp = readdir(dir)) != NULL) //读文件夹里文件的名字 { if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0)) { continue; } printf( "type=%d %s\n",dirp->d_type,dirp->d_name); total_num++; } printf("\ntotal file number :%d\n",total_num); closedir(dir); return 0; }
sudo ./a.out /etc/
sudo ./a.out ./