c++ 11 目录流DIR,dirent使用

void GetFiles(const std::string& img_dir_path,std::vector<std::string> &img_file_paths)
{
    DIR* dir;
    if ((dir = opendir(img_dir_path.c_str())) == nullptr) {
        throw std::runtime_error("directory " + img_dir_path + " does not exist");
    }
    dirent* dp;
    for (dp = readdir(dir); dp != nullptr; dp = readdir(dir)) {
        const std::string img_file_name = dp->d_name;

    // 使用readdir读取目录中的所有文件 
    // 默认情况下,包括了‘.‘和‘..‘目录文件
if (img_file_name == "." || img_file_name == "..") {
            continue;
        }
        img_file_paths.push_back(img_dir_path + "/" + img_file_name);
    }
    closedir(dir);

    std::sort(img_file_paths.begin(), img_file_paths.end());
}
  • 在上述代码中,通过使用 DIR、dirent 数据结构和 opendir、readdir 函数,实现了对目录及目录中的文件进行操作的目的;
  • 结构体 dirent 中的成员 d_type 表示读取的目录中的文件的类型,d_name 表示读取的目录中的文件的名字。
    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;

    函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:
    struct dirent *readdir(DIR *dp);//读取到的文件名存储在结构体dirent的d_name成员中

    void rewinddir(DIR *dp);

    int closedir(DIR *dp);

    long telldir(DIR *dp);

    void seekdir(DIR *dp,long loc);

    #include <dirent.h>
     
    struct dirent
    {
        long d_ino;               /* inode number 索引节点号 */
        off_t d_off;              /* offset to this dirent 在目录文件中的偏移 */
        unsigned short d_reclen;  /* length of this d_name 文件名长 */
        unsigned char d_type;     /* the type of d_name 文件类型 */
        char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长256字符 *

     

c++ 11 目录流DIR,dirent使用

上一篇:Java基础系列(11)- 变量、常量、作用域以及变量的命名规范


下一篇:Spring Boot自动配置