linux 遍历指定目录下所有文件

517 阅读2分钟
总体概述

在linux系统环境下,实现对指定的目录下所有文件的遍历。需要用到的函数有opendir, readdir, closedir三个函数。

函数原型

opendir函数原型:DIR *opendir(const char *name); readdir函数原型:struct dirent *readdir(DIR *dirp); closedir函数原型:int closedir(DIR *dirp);

函数作用

opendir函数的作用:打开一个给定的目录文件,并返回目录流指针。 readdir函数的作用:读取一个指向dirent的结构体指针。 closedir函数的作用:关闭一个已经打开的目录流指针,与opendir成对出现。

参数介绍

opendir参数介绍:

  • 输入参数:name => 传入目录的路径名。
  • 返回值:DIR * => 成功:返回目录流指针;失败:返回 NULL。

readdir参数介绍:

  • 输入参数:dirp => 打开的目录流指针,readdir成功之后就会指向下一个目录的指针。
  • 返回值:struct dirent * => 成功:返回目录结构体指针;失败或者到达目录流的末尾:返回 NULL。

closedir参数介绍:

  • 输入参数:dirp => 打开的目录流指针
  • 返回值:成功:返回 0;失败: 返回 -1。
补充:struct dirent 结构体的原型
struct dirent {
       ino_t          d_ino;       /* inode number */
       off_t          d_off;       /* not an offset; see NOTES */
       unsigned short d_reclen;    /* length of this record */
       unsigned char  d_type;      /* type of file; not supported by all filesystem types */
       char           d_name[256]; /* filename */
};
代码示例
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("usage: %s <pathname>\r\n", argv[0]);
        return -1;
    }
​
    DIR *dirp = opendir(argv[1]);
    if (!dirp) {
        printf("open dir %s failed.\r\n", argv[1]);
        return -1;
    }
​
    struct dirent *dirent;
    while ((dirent = readdir(dirp))) {
        if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, ".."))
            continue;
        printf("%s\t", dirent->d_name);
    }
    printf("\n");
​
    return closedir(dirp);
}
使用方法
$ mkdir ~/clanguage && cd ~/clanguage
$ touch directory.c    注:创建并拷贝代码到directory.c,保存退出。
$ gcc -o directory directory.c
$ ./directory ./       注:显示当前目录下的文件

注:由于作者能力有限,文中表述难免有错误。如果发现文中错误之处,敬请广大好友批评指正。