目录的操作
创始人
2025-06-01 04:41:46

目录操作


文章目录

  • 目录操作
  • 文件的描述
  • opendir: 打开目录
  • readdir: 读取目录
  • readlink: 取得符号连接所指的文件
  • eg


文件的描述

/** 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 
#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 ./

在这里插入图片描述

相关内容

热门资讯

「实测推荐」三哥玩.怎么装挂 「实测推荐」三哥玩.怎么装挂亲,三哥玩这个游戏其实有挂的,确实是有挂的,需要了解加客服微信【9951...
&lt;今日了解>... 有 亲,根据资深记者爆料中至吉安麻将是可以开挂的,确实有挂(咨询软件无需...
实测分享“吉祥麻将有挂吗”原来... 您好:吉祥麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【6670747】很多玩家在这款游戏...
[实测了解]“正宗南通长牌是不... 您好:正宗南通长牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8383742】很多玩家在这款...
重大通报-"钱塘十三... 重大通报-"钱塘十三水到底有没有挂"2025(果然有挂)您好:钱塘十三水这款游戏可以开挂,确实是有挂...