linux中的目录操作函数

参考

【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构

stat函数

    C标准库提供了访问linux的目录的函数接口现对目录的操作。

一、libc接口

    libc访问目录的流程为:打开目录,访问目录,关闭目录。以及一些操作目录指针位置的函数。

打开目录

DIR *opendir(const char *name);
DIR *fdopendir(int fd);

一个是根据路径名称打开文件,而另一个是根据文件描述符打开目录。

DIR结构体是一个目录流(Directory Stream)的类型定义

struct __dirstream
{
    void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
    char *__data; /* Directory block.   */
    int __entry_data; /* Entry number `__data' corresponds to.   */
    char *__ptr; /* Current pointer into the block.   */
    int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
    size_t __allocation; /* Space allocated for the block.   */
    size_t __size; /* Total valid data in the block.   */
    __libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};

typedef struct __dirstream DIR;

其实到不需要理解每个成员的含义,调用流程就在那。

访问目录

struct dirent *readdir(DIR *dirp);

从目录流中读取一个文件结点信息,成功则返回目录信息,并且dirp指向下个目录进入点.,有错误发生或读取到目录文件尾则返回NULL。这就提供了循环遍历目录的方法。

dirent结构定义

struct dirent {
   ino_t          d_ino;       /* inode number i节点编号 */
   off_t          d_off;       /* not an offset; see NOTES 早期文件系统中,telldir返回文件在目录内的偏移 */
   unsigned short d_reclen;    /* length of this record dirent 记录的实际长度 */
   unsigned char  d_type;      /* type of file; not supported
                                  by all filesystem types 文件类型 */
   char           d_name[256]; /* filename 文件名 */
};

其中,d_type的类型有:

  • DT_BLK This is a block device.这是一个块设备。
  • DT_CHR This is a character device.这是一个字符设备。
  • DT_DIR This is a directory.这是一个目录。
  • DT_FIFO This is a named pipe (FIFO).这是一个命名管道(FIFO)。
  • DT_LNK This is a symbolic link.这是一个符号链接。
  • DT_REG This is a regular file.这是一个标准文件。
  • DT_SOCK This is a UNIX domain socket.这是一个Unix域套接字。
  • DT_UNKNOWN The file type is unknown.文件类型未知。

例如循环读取目录下的信息

const char* path = ...
DIR* dirp = opendir(path);
struct dirent *dp;
while ((dp = readdir(dirp)) != NULL) {
  // 读取、打印文件名、文件类型等信息
  printf dp->d_name, d_type
}

关闭目录

int closedir(DIR *dirp);

成功返回0, 失败返回-1。

调整目录流位置指针

telldir

long telldir(DIR *dirp);

用于获取当前目录流(Directory Stream)的位置指针。这个位置指针表示你当前遍历到的是该目录下的第几个子目录。就像目录流是一个数组,返回当前位置的索引。

seekdir

void seekdir(DIR *dirp, long loc);

用于设置目录流的位置指针。你可以通过这个函数跳转到指定的子目录。这个函数有点奇怪,为什么返回是void,如果索引超出,是将dirp直接置null吗?

rewinddir

void rewinddir(DIR *dirp);

用于重置目录流的位置指针到流的起始位置。

二、stat函数

    stat函数用于获取文件的信息

int stat(const char *path, struct stat *buf)

struct stat结构体

struct stat
{
    dev_t     st_dev;     /* ID of device containing file */文件使用的设备号
    ino_t     st_ino;     /* inode number */    索引节点号 
    mode_t    st_mode;    /* protection */  文件对应的模式,文件,目录等
    nlink_t   st_nlink;   /* number of hard links */    文件的硬连接数  
    uid_t     st_uid;     /* user ID of owner */    所有者用户识别号
    gid_t     st_gid;     /* group ID of owner */   组识别号  
    dev_t     st_rdev;    /* device ID (if special file) */ 设备文件的设备号
    off_t     st_size;    /* total size, in bytes */ 以字节为单位的文件容量   
    blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小   
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */ 该文件所占的磁盘块  
    time_t    st_atime;   /* time of last access */ 最后一次访问该文件的时间   
    time_t    st_mtime;   /* time of last modification */ /最后一次修改该文件的时间   
    time_t    st_ctime;   /* time of last status change */ 最后一次改变该文件状态的时间   
};
st_dev:该字段用于描述此文件所在的设备。不常用,可以不用理会。
st_ino:文件的 inode 编号。
st_mode:该字段用于描述文件的模式,譬如文件类型、文件权限都记录在该变量中。
st_nlink:该字段用于记录文件的硬链接数,也就是为该文件创建了多少个硬链接文件。链接文件可以分为软链接(符号链接)文件和硬链接文件。
st_uid、st_gid:此两个字段分别用于描述文件所有者的用户 ID 以及文件所有者的组 ID。
st_rdev:该字段记录了设备号,设备号只针对于设备文件,包括字符设备文件和块设备文件,不用理会。
st_size:该字段记录了文件的大小(逻辑大小),以字节为单位。
st_atim、st_mtim、st_ctim:此三个字段分别用于记录文件最后被访问的时间、文件内容最后被修改的时间以及文件状态最后被改变的时间,都是 struct timespec 类型变量。

st_mode 变量

1、S_IFMT 0170000 文件类型的位遮罩 
2、S_IFSOCK 0140000 scoket
3、S_IFLNK 0120000 符号连接 
4、S_IFREG 0100000 一般文件 
5、S_IFBLK 0060000 区块设备 
6、S_IFDIR 0040000 目录 
7、S_IFCHR 0020000 字符设备 
8、S_IFIFO 0010000 先进先出 
9、S_ISUID 04000 文件的 (set user-id on execution)位 
10、S_ISGID 02000 文件的 (set group-id on execution)位 
11、S_ISVTX 01000 文件的sticky 位 
12、S_IRUSR (S_IREAD) 00400 文件所有者具可读取权限 
13、S_IWUSR (S_IWRITE)00200 文件所有者具可写入权限 
14、S_IXUSR (S_IEXEC) 00100 文件所有者具可执行权限 
15、S_IRGRP 00040 用户组具可读取权限 
16、S_IWGRP 00020 用户组具可写入权限 
17、S_IXGRP 00010 用户组具可执行权限 
18、S_IROTH 00004 其他用户具可读取权限 
19、S_IWOTH 00002 其他用户具可写入权限 
20、S_IXOTH 00001 其他用户具可执行权限上述的文件类型在 POSIX 中定义了检查这些类型的宏定义 
21、S_ISLNK (st_mode) 是否是一个连接
22、S_ISREG (st_mode) 是否是一个常规文件
23、S_ISDIR (st_mode) 是否是一个目录 
24、S_ISCHR (st_mode) 是否是一个字符设备
25、S_ISBLK (st_mode) 是否是一个块设备
26、S_ISFIFO (st_mode) 是否是一个FIFO文件
27、S_ISSOCK (st_mode) 是否是一个SOCKET文件 
若一目录具有sticky 位 (S_ISVTX), 则表示在此目录下的文件只能 被该文件所有者、此目录所有者或root 来删除或改名.
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值