/** 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];
};
头文件: 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 核心内存不足
头文件: 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 为无效的目录流.
头文件: 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 路径中的目录存在但却非真正的目录
#include
#include
#include
#include #define DIRNAME "/www"
#define PHOTO_NUM_MAX 100int 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 ./