目录的操作
创始人
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 ./

在这里插入图片描述

相关内容

热门资讯

豆包手机重启限量发售!此前传被... 本文来源:时代周报 作者:何珊珊因AI接管功能迅速走红的豆包手机再次开放少量购买资格,此前它已接连深...
治不了阿尔兹海默还治不了你 今天看到复星医药准备花14亿把神药公司绿谷给买了,那乃悟作为绿谷的老朋友高低得来两句。绿谷现在最广为...
放弃控制权、索赔额大减36%!... 广州轻工工贸集团有限公司(下称“广州轻工集团”)放弃良品铺子了。12月16日,良品铺子发布公告称,广...
知名富翁疯狂代孕,吓坏美国法官... 近日,有媒体报道,一位中国亿万富翁在美国 “疯狂”代孕,吓得法官否了他的亲权申请。而这位富翁,正是多...
用12个问题,开启更有钱的20... 点击 “简七读财” ,发送消息“ 理财 ”小白轻松入门~晚上好,我是简七~上周我去了一趟普陀山,在...