C语言,C++的文件夹操作常见的只有opendir(),readdir(),closedir(),rewinddir(),在<dirent.h>中有DIR,struct dirent两个结构体,对系统fcntl进行复杂操作,最后就给出个d_name名字能看懂(linux还有d_type)
每次使用dirent时常常需要把路径拼接起来,跳过最前面的两个“文件夹”:.(本身)和..(上级文件夹),windows还需要stat判断文件类型。
这样复杂的处理代码,用一次dirent就得写一次,还很冗余,散架易错。我们需要一套半自动处理结构,简化代码,减轻应用层负担。于是我个人写了ddir包装体,实现一键拼路径、调点点、判断类型。
struct _ddir {
char* _path; 含完整路径结果
int _catPos; strcpy位置
short _flag;
short d_type; windows还能算type
char* d_name; 与struct dirent同名兼容,放心替换
DIR* _dir;
};
typedef struct _ddir ddir;
常见的dirent使用方法如下:
void func(void)(整体标记)
{ const char* pathdir="/storage/emulated/0/";(斜杠结尾)
char pathbuf[256];
strcpy(pathbuf,pathdir);
strcat(pathbuf,ent->d_name);
然后pathbuf才是完整路径,才能用。
对于Windows,struct dirent中没有d_type,难以区分文件还是文件夹,就要stat(),毕竟dirent全称是directory entry(文件夹入口)。
struct stat st;
if(stat(pathbuf,&st)==0)
{ if(S_ISDIR(st.st_mode)) type=4 //文件夹
if(S_ISREG(st.st_mode)) type=8 //文件
} ...
}
我的ddir半自动工作原理:
void* myreaddir(x)
{ retptr=readdir(x);
func();
return retptr;
}
这就叫包装,使得将来的功能使用更简洁,这就值得。自己动手,丰衣足食。于是我把自创源码免费分享给大家,用就拿走。欢迎讨论意见,给变量取个更好听的名字。
如果对您有帮助,点个赞可以让更多人看到~
#ifndef _DDIR_H //Writer: Dexam
#define _DDIR_H //Date: 2022.4.23
#include <dirent.h>
#include <stdlib.h> //m