C++ <dirent.h>目录操作函数

包含头文件

#include <dirent.h>

struct dirent结构

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) 文件名,最长255字符 */
}

DIR结构

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;

DIR和dirent的指针都可以打开dir,dirent 还可以获取文件名。

opendir(打开目录)

相关函数 open,readdir,closedir,rewinddir,seekdir,telldir,scandir
表头文件 #include<sys/types.h>
#include<dirent.h>
定义函数 DIR * opendir(const char * name);
函数说明 opendir()用来打开参数name指定的目录,并返回DIR形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。
返回值 成功则返回DIR
型态的目录流,打开失败则返回NULL。
错误代码 EACCESS 权限不足
EMFILE 已达到进程可同时打开的文件数上限。
ENFILE 已达到系统可同时打开的文件数上限。
ENOTDIR 参数name非真正的目录
ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。
ENOMEM 核心内存不足。

readdir(读取目录)

相关函数 open,opendir,closedir,rewinddir,seekdir,telldir,scandir
表头文件 #include<sys/types.h>
#include<dirent.h>
定义函数 struct dirent * readdir(DIR * dir);
函数说明 readdir()返回参数dir目录流的下个目录进入点。
结构dirent定义如下
struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256;
};
d_ino 此目录进入点的inode
d_off 目录文件开头至此目录进入点的位移
d_reclen _name的长度,不包含NULL字符
d_type d_name 所指的文件类型
d_name 文件名
返回值 成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。
附加说明 EBADF参数dir为无效的目录流。

closedir(关闭目录)

相关函数 opendir
表头文件 #include<sys/types.h>
#include<dirent.h>
定义函数 int closedir(DIR *dir);
函数说明 closedir()关闭参数dir所指的目录流。
返回值 关闭成功则返回0,失败返回-1,错误原因存于errno 中。
错误代码 EBADF 参数dir为无效的目录流
范例 参考readir()。

代码示例1

/*
    只遍历第一级目录;
    append用法
*/
#include<iostream>
#include<dirent.h>
#include<string.h>
#include<vector>

using namespace std;

int main(int argc, char** argv)
{
    
    
    string dir_path = "./cal/Test1/raw0/";
    char rootdir[100];
    strcpy(rootdir, dir_path.c_str());

    DIR* dir;
    struct dirent* ptr;
    std::vector<std::string> file_list;

    dir = opendir(rootdir);
    while ((ptr = readdir(dir)) != NULL)
    {
    
    
        if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
        {
    
    
        continue;
        }
        if (strcmp(ptr->d_name, "pcd") == 0) //可用于剔除其他指定的文件夹
        {
    
    
        continue;
        }
        file_list.push_back(ptr->d_name);
    }
    closedir(dir);
    
    for(int i=0;i<file_list.size();i++)
    {
    
    
        cout<<file_list[i]<<endl;
    }
    

猜你喜欢

转载自blog.csdn.net/pj_wxyjxy/article/details/129985880