C++读取特定路径下文件目录及文件名称亲测有效。主要用到了以下几个头文件(类):io.h,fstream,string,vector
1、读取某给定路径下所有文件夹与文件名称,并带完整路径。代码如下:
1 void getAllFiles(string path, vector& files) {
2 //文件句柄
3 long hFile = 0;//x64下改成long long
4 //文件信息
5 struct _finddata_t fileinfo; //很少用的文件信息读取结构
6 string p; //string类很有意思的一个赋值函数:assign(),有很多重载版本
7 if ((hFile = _findfirst(p.assign(path).append("\*").c_str(),&fileinfo)) != -1) {
8 do {
9 if ((fileinfo.attrib & _A_SUBDIR))
{ /*比较文件类型是否是文件夹 attrib,就是所查找文件的属性:__A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。**/
10 if (strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"…") != 0) {
11 files.push_back(p.assign(path).append("\").append(fileinfo.name));
12 getAllFiles(p.assign(path).append("\").append(fileinfo.name), files);
13 }
14 } else {
15 files.push_back(p.assign(path).append("\").append(fileinfo.name));
16 }
17 } while (_findnext(hFile, &fileinfo) == 0); //寻找下一个,成功返回0,否则-1
18 _findclose(hFile);
19 }
20 }
该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):
1 char* filePath = “H:\mpitrain空";
2 vector files;
3 char* distAll = “AllFiles.txt”;
4 getAllFiles(filePath, files);
5 ofstream ofn(distAll);
6 int size = files.size();
7 ofn<
9 ofn<
11 ofn.close();
完美运行,结果如下图:
同理,只读取某给定路径下的当前文件夹名(以下类似,只给出函数,调用案例同上):
1 void getJustCurrentDir(string path, vector& files) {
2 //文件句柄
3 long hFile = 0;
4 //文件信息
5 struct _finddata_t fileinfo;
6 string p;
7 if ((hFile = _findfirst(p.assign(path).append("\*").c_str(),&fileinfo)) != -1) {
8 do {
9 if ((fileinfo.attrib & _A_SUBDIR)) {
10 if (strcmp(fileinfo.name, “.”) != 0 && strcmp(fileinfo.name, “…”) != 0) {
11 files.push_back(fileinfo.name);
12 //files.push_back(p.assign(path).append("\").append(fileinfo.name));
13 }
14 }
15 } while (_findnext(hFile, &fileinfo) == 0);
16 _findclose(hFile);
17 }
18 }
只读取某给定路径下的当前文件名(该函数有问题还未来得及修改。。不知为啥读取文件数总是为0,另外两个函数亲测有效):
1 void getJustCurrentFile(string path, vector& files) {
2 //文件句柄
3 long hFile = 0;
4 //文件信息
5 struct _finddata_t fileinfo;
6 string p;
7 if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1) {
8 do {
9 if ((fileinfo.attrib & _A_SUBDIR)) {
10 ;
11 } else {
12 files.push_back(fileinfo.name);
13 //files.push_back(p.assign(path).append("\").append(fileinfo.name));
14 }
15 } while (_findnext(hFile, &fileinfo) == 0);
16 _findclose(hFile);
17 }
18 }
只读取某给定路径下的所有文件名(即包含当前目录及子目录的文件):
1 void getFilesAll(string path, vector& files) {
2 //文件句柄
3 long hFile = 0;
4 //文件信息
5 struct _finddata_t fileinfo;
6 string p;
7 if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1) {
8 do {
9 if ((fileinfo.attrib & _A_SUBDIR)) {
10 if (strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"…") != 0) {
11 //files.push_back(p.assign(path).append("\").append(fileinfo.name));
12 getFilesAll(p.assign(path).append("\").append(fileinfo.name), files);
13 }
14 } else {
15 files.push_back(p.assign(path).append("\").append(fileinfo.name));
16 }
17 } while (_findnext(hFile, &fileinfo) == 0);
18 _findclose(hFile);
19 }
20 }
至此,简单的读取功能就实现了,以后只要指定路径,就能轻松地得到对应的路径与文件名称。
long long类型在64位程序下可以使用,long类型只能在32位下使用
#include
#include
#include
#include
#include
using namespace std;
//其实两个字符串连在一起比如string可惜写成:str1+str2+“xxx”。。。
//获取所有的文件名
void GetAllFiles( string path, vector& files)
{
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;//用来存储文件信息的结构体
string p;
if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1) //第一次查找
{
do
{
if((fileinfo.attrib & _A_SUBDIR)) //如果查找到的是文件夹
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0) //进入文件夹查找
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
GetAllFiles( p.assign(path).append("\\").append(fileinfo.name), files );
}
}
else //如果查找到的不是是文件夹
{
files.push_back(p.assign(fileinfo.name) ); //将文件路径保存,也可以只保存文件名: p.assign(path).append("\\").append(fileinfo.name)
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile); //结束查找
}
}
//获取特定格式的文件名
void GetAllFormatFiles( string path, vector& files,string format)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if((hFile = _findfirst(p.assign(path).append("\*" + format).c_str(),&fileinfo)) != -1)
{
do
{
if((fileinfo.attrib & _A_SUBDIR))
{
if(strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"…") != 0)
{
//files.push_back(p.assign(path).append("\").append(fileinfo.name) );
GetAllFormatFiles( p.assign(path).append("\").append(fileinfo.name), files,format);
}
}
else
{
files.push_back( p.assign(fileinfo.name)); //将文件路径保存,也可以只保存文件名: p.assign(path).append("\").append(fileinfo.name)
}
}while(_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
// 该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);
// 第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
// 在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):
int main()
{
string filePath = “D:\文档\课程\数据结构\MOOC练习\testPCL\x64\Debug”;
vector files;
char * distAll = “AllFiles.txt”;
//读取所有的文件,包括子文件的文件
//GetAllFiles(filePath, files);
//读取所有格式为jpg的文件
string format = ".dll";
GetAllFormatFiles(filePath, files,format);
ofstream ofn(distAll);
int size = files.size();
ofn<
}
参考:https://blog.csdn.net/qq_34500588/article/details/83043377
https://www.2cto.com/kf/201407/316515.html