4.21 opendir、readdir和closedir函数-读目录

mkdir和rmdir分别用于创建目录文件和删除目录文件。自然还会有读目录文件的函数。

opendir函数用于打开一个目录文件,获取一个目录描述符,相当于普通文件的open函数;

closedir函数用于关闭一个已经打开的目录文件,相当与普通文件的close函数;

readdir函数用于逐个读出目录表中的目录项(参考《4.20 mkdir和rmdir函数》),相当于普通文件的read函数。

三个函数的原型如下:

#include <dirent.h>
DIR *opendir(const char *pathname);
/*返回值:若成功返回一个DIR指针,若出错则返回NULL*/
struct dirent *readdir(DIR *dp);
/*若成功则返回指针,若已到目录表结尾或出错则返回-1*/
int closedir(DIR *dp);
/*若成功则返回0,若出错则返回-1*/

参数: pathname 目录的路径名

dirent是一个描述目录项的结构,定义如下:

struct dirent {
     ino_t d_ino; /*i节点指针*/
     char  d_name[NAME_MAX + 1]; /*文件名*/
};

实例 x.4.21.1.c

#include <stdio.h>
#include <dirent.h>
#include <unistd.h>

int main(void)
{
    char           pathname[] = "/tmp/mydir";
    DIR            *dp;
    struct dirent  *dir;

    
    if ((dp = opendir(pathname)) == NULL) {  /*打开目录,取得目录DIR指针*/
        printf("opendir error for %s\n", pathname);
        return 1;
    }   

/*循环读出目录表的目录项*/
    while ((dir = readdir(dp)) != NULL){
        printf("d_ino:%d; d_name:%s\n", dir->d_ino, dir->d_name);
    }   

    if (dir != NULL){
        printf("d_ino:%d; d_name:%s\n", dir->d_ino, dir->d_name);
    }   

    closedir(dp);

    return 0;
}

编译与执行:

[root@localhost unixc]# rm -rf /tmp/mydir
[root@localhost unixc]# mkdir /tmp/mydir
[root@localhost unixc]# mkdir /tmp/mydir/dir1  /tmp/mydir/dir2
[root@localhost unixc]# echo "123456789" > /tmp/mydir/file1
[root@localhost unixc]# echo "abcdefjhij" > /tmp/mydir/file2
[root@localhost unixc]# ls -l /tmp/mydir
total 16
drwxr-xr-x. 2 root root 4096 Nov  5 08:13 dir1
drwxr-xr-x. 2 root root 4096 Nov  5 08:13 dir2
-rw-r--r--. 1 root root   10 Nov  5 08:14 file1
-rw-r--r--. 1 root root   11 Nov  5 08:14 file2
[root@localhost unixc]# cc x.4.21.1.c
[root@localhost unixc]# ./a.out
d_ino:917505; d_name:..
d_ino:1062324; d_name:file1
d_ino:1064131; d_name:file2
d_ino:1062290; d_name:.
d_ino:1062323; d_name:dir2
d_ino:1062316; d_name:dir1
[root@localhost unixc]#

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值