dirent.h使用详解

news/2024/11/29 4:35:22/

LINUX下历遍目录的方法一般是这样的
打开目录-》读取-》关闭目录
相关函数是
opendir -> readdir -> closedir

#include <dirent.h>
DIR *opendir(const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

好了,三个函数都出来了,原型就是上面。

opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针,参数*dirname是一个字符数组或者字符串常量;

readdir函数用于读取目录,只有一个参数,就是opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *;

DIR结构体定义

struct __dirstream   
{   void *__fd;    char *__data;    int __entry_data;    char *__ptr;    int __entry_ptr;    size_t __allocation;    size_t __size;    __libc_lock_define (, __lock)    
};   
typedef struct __dirstream DIR;  

dirent的结构如下定义

struct dirent
{
long d_ino;                     
off_t d_off;                    
unsigned short d_reclen;        
char d_name [NAME_MAX+1];       
}

结构体中

  • d_ino存放的是该文件的索引节点号inode;
  • d_off 是文件在目录中的编移,具体是什么意思也不是很明白,很少用到它,
  • 基本上就是用到d_name
  • short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是两回回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大。
  • 最后一个元素就是我们要的了,文件名称。

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数
int stat(const char *file_name, struct stat *buf);的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:

struct stat {   mode_t     st_mode;       //文件访问权限   ino_t      st_ino;       //索引节点号   dev_t      st_dev;        //文件使用的设备号   dev_t      st_rdev;       //设备文件的设备号   nlink_t    st_nlink;      //文件的硬连接数   uid_t      st_uid;        //所有者用户识别号   gid_t      st_gid;        //组识别号   off_t      st_size;       //以字节为单位的文件容量   time_t     st_atime;      //最后一次访问该文件的时间   time_t     st_mtime;      //最后一次修改该文件的时间    time_t     st_ctime;      //最后一次改变该文件状态的时间   blksize_t st_blksize;    //包含该文件的磁盘块的大小   blkcnt_t   st_blocks;     //该文件所占的磁盘块   };  

这个记录的信息就很详细了吧.
最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?

  1. 首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。
  2. 接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
  3. 然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。

实例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
void print_usage(void);void print_usage(void)
{printf("Usage: test dirname\n");
}int main(int argc,char *argv[])
{DIR * dp;struct dirent *filename;if (argc < 2){print_usage();exit(1);}dp = opendir(argv[1]);if (!dp){fprintf(stderr,"open directory error\n");return 0;}while (filename = readdir(dp)){printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",filename->d_name,filename->d_ino,filename->d_reclen);}closedir(dp);return 0;
}

参考

http://blog.csdn.net/zhuyi2654715/article/details/7605051
http://www.cnblogs.com/onlycxue/p/3154341.html


http://www.ppmy.cn/news/261242.html

相关文章

SATA协议14种FIS介绍

&#xfeff;&#xfeff; FIS(Frame Information Structure)解析 FIS是一种用于Host和device之间信息传输的机制&#xff0c;每个FIS的格式都是固定的&#xff0c;并且对应唯一的ID&#xff0c;SATA Spec定义了14类FIS ID。 但是&#xff0c;实际上&#xff0c;我们用到主要是…

机器人之D-H模型建立和推导

D-H建模原理推导 1.1 基本思路 D-H建模具体思路是先分别在每个关节加建立关节坐标系&#xff0c;确定关节刚性连杆参数&#xff0c;再依次将关节变换联系起来&#xff0c;计算出末端执行器相对于参考坐标系的变换关系得到坐标变换矩阵&#xff0c;从而建立机械臂运动学方程。关…

03_D-H参数表的建立

D-H参数表&#xff0c;实际上是相邻各个关节坐标的变换关系表&#xff0c;根据之前针对各个关节所建立的坐标系&#xff0c;按照如下四条变换规则&#xff0c;即可得到D-H参数表。 建立D-H参数表的详细步骤&#xff1a; 根据上图所示机械臂的尺寸参数以及以上六个步骤的变换&am…

机器人正向运动学和D-H参数方法

1 概念 1.1 机器人 本文讨论的机器人&#xff0c;为空间开链连杆机构&#xff0c;其中的运动副&#xff08;转动副或移动副&#xff09;常称为关节&#xff0c;关节个数通常即为机器人的自由度数。 即&#xff1a;机器人由一系列关节&#xff08;Joint&#xff09;和连杆&…

H265

H265 1、H265一个图像序列的组成&#xff1a;VPSSPSPPSSEI一个I帧若干个P帧。VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称 为一个NALU。 2、H265的NALU结构&#xff1a;开始码NALU头NALU数据 &#xff08;1&#xff09;、开始码大小为四个字节&#xff0c;是一个固定值00 00…

关于D-H参数法建模

关于D-H参数法建模 ​D-H参数法一般有两种定义方式&#xff0c;分别为标准D-H参数法和改进D-H参数法。初学D-H参数法&#xff0c;很容易被这两种定义方式搞晕&#xff0c;因为很多参考书中仅介绍了一种定义方式&#xff0c;而当我们查找资料时看到另一种定义方式时就会很困惑&…

【机器人基础】标准D-H建模法(机器人建模与控制)

重新看了一遍《机器人建模与控制》这本书&#xff0c;感觉之前写的正解的理解还不到位&#xff0c;于是又重新写了这篇总结。这篇文章先更新在知乎里的&#xff0c;因为两个平台的编辑器模式不一样&#xff0c;所以就直接截了知乎的图片放在这里了&#xff0c;大部分还算清晰的…

5w2h原则指的是什么_5W2H指的是什么?

展开全部 5W2H分析法又叫七问分析法&#xff0c;是二战中美国陆军兵器修理部首创。62616964757a686964616fe78988e69d8331333431363636 其简单、方便、易于理解、富有启发意义&#xff0c;广泛用于企业管理和技术活动&#xff0c;对于决策和执行性的活动措施也非常有帮助&#…