C++读取特定路径下文件目录及文件名称

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<<size<<endl;
8 for (int i = 0; i < size; i++) {
9 ofn<<files[i]<<endl;
10 }
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 <io.h>
#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<<size<<endl;  
for (int i = 0;i<size;i++)    
{    
    ofn<<files[i]<<endl; // 写入文件  
    cout<< files[i] << endl;//输出到屏幕  
}  
ofn.close();  
return 0;  

}

参考:https://blog.csdn.net/qq_34500588/article/details/83043377
https://www.2cto.com/kf/201407/316515.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值