在最近做的一个项目中,需要一个获取一个文件夹下文件的功能,之前一直对文件的操作一直停留在对文件的读写,还从来没有接触过文件夹相关的操作。因此,这次有幸使用了,还是记录下来吧,以后肯定也会有很多使用的机会。
参考博客
C++ 文件/文件夹操作
1 本人项目中使用的方法(算比较蠢的吧,还是代码写的太少了。。)
需要使用dirent.h这个头文件,然后使用的基本流程是opendir ->readdir->closedir
和FILE类型不同,这里opendir返回的是DIR类型的指针。readdir返回的是struct dirent结构体类型。
结构体的详细内容如下:
struct dirent
{
#ifndef __USE_FILE_OFFSET64
__ino_t d_ino;
__off_t d_off;
#else
__ino64_t d_ino;
__off64_t d_off;
#endif
unsigned short int d_reclen;
unsigned char d_type;
char d_name[256]; /* We must not include limits.h! */
};
//查找path路径下的所有文件
vector<string> findFileNames(const char* path){
//用于保存文件名
vector<string> fileNames;
//dirent指针是一个结构体指针
struct dirent *ptr;
DIR *dir;
dir=opendir(path);
while((ptr=readdir(dir))!=NULL)
{
//跳过'.'和'..'两个目录
if(ptr->d_name[0] == '.')
continue;
fileNames.push_back(ptr->d_name);
}
closedir(dir);
return fileNames;
}
这个方法是适用于Linux下的文件操作,在Windows上测试会报头文件找不到。如果真的要使用的话需要去下载这个头文件,并放入VS的include文件夹下即可。
下载地址
dirent.h
2.filesystem库(和上一个相比,这个就和谐多了,是可移植的)
2.1 获取文件的一些属性
//注意 /= 和 += 的区别, /= 表示追加下级目录, += 仅仅是字符串的串接
path dir("C:\\Windows");
dir /= "System32"; //追加下级目录
dir /= "services.exe";
std::cout << dir << std::endl;
std::cout << dir.string() << std::endl; //转换成std::string 类型
std::cout << dir.root_name()<< std::endl; //盘符名:C:
std::cout << dir.root_directory()<< std::endl; //根目录:"\"
st