关于遍历文件夹获取子文件

整理一下网上学习到的Visual studio 2015版的获取文件中文件的程序

一、获取当前文件夹中的图片

下面程序是获取当前文件夹中的所有“bmp”图片并将路径保存到名为“file_container”的容器中,然后利用OpenCV的Mat将图片读取。注意,这里并不遍历子文件。

#include<opencv2\opencv.hpp>
#include<io.h>

using namespace cv;
using namespace std;

#define LOAD_PATH  "F:\\data"
#define DATA_TYPE  "bmp"

void GetAllPicture(vector<string>&files);

int main()
{
	vector<string>file_container;
	Mat srcImg;
	GetAllPicture(file_container);
	for (size_t i = 0; i < file_container.size(); i++)
	{
		srcImg = imread(file_container[i].c_str());
		imshow("图像", srcImg);
		waitKey(1);		
	}
	return 1;
}

/*获取当前文件夹下的所有图片文件*/
void GetAllPicture(vector<string>&files)
{
	_finddata_t fileinfo;
	long DataHandle;
	string path;

	if ((DataHandle =_findfirst(path.append(LOAD_PATH).append("\\*.").append(DATA_TYPE).c_str(),&fileinfo))==-1L)
	{
		cout << "PATH ERROR!" << endl;
		return;
	}
	else
	{
		do
		{
			path.clear();
			//cout << "FILE NAME :" << fileinfo.name<< endl;
			files.push_back(path.append(LOAD_PATH).append(fileinfo.name));

		} while (_findnext(DataHandle,&fileinfo)==0);
	}
	_findclose(DataHandle);
	return;
}

二、获取当前文件夹和所有子文件夹中的图片
下面程序是遍历给定路径中所有的文件夹(包含所有子文件夹)中的“BMP”、“JPG”格式(这里可以选择输出任意格式的文件,只需要把对应代码出的文件后缀改变即可)并将图片输出到名为“files”的VECTOR 容器中

#include<opencv2\opencv.hpp>
#include<io.h>

using namespace cv;
using namespace std;

#define LOAD_PATH  "F:\\data"

void GetAllFilesToVector(string folderPath,vector<string>&files);

int main()
{
	vector<string>file_container;
	Mat srcImg;

	string File_Ergodicity;
	File_Ergodicity.append(LOAD_PATH);
	GetAllFilesToVector(File_Ergodicity, file_container);
	
	for (size_t i = 0; i < file_container.size(); i++)
	{
		srcImg = imread(file_container[i].c_str());
		imshow("图像", srcImg);
		waitKey(10);		
	}
	return 1;
}

/*遍历文件夹和子文件夹*/
void GetAllFilesToVector(string folderPath, vector<string>&files)
{
	long FilesHandle;
	_finddata_t fileinfo;
	string FilesPath = folderPath + "\\*";
	

	
	if ((FilesHandle = _findfirst(FilesPath.c_str(), &fileinfo)) == -1L)
	{
		cout << "PATH ERROR!" << endl;
		return;
	}
	do
	{
		string newPath;
		//判断是否有子目录
		if (fileinfo.attrib & _A_SUBDIR)
		{
			if ((strcmp(fileinfo.name,".")!=0)&&(strcmp(fileinfo.name,"..")!=0))
			{
				newPath = folderPath + "\\" + fileinfo.name;
				GetAllFilesToVector(newPath, files);
			}
			else{}
		}	
		else
		{
			if ((strstr(fileinfo.name,".bmp")!=NULL)|| (strstr(fileinfo.name, ".jpg") != NULL))
			{
				newPath = folderPath + "\\" + fileinfo.name;
				files.push_back(newPath);
				
			}
			else
				return;
		}
	} while (_findnext(FilesHandle,&fileinfo)==0);

	_findclose(FilesHandle);
	return;
}

三、获取当前文件夹和所有子文件夹中的图片,并输出到TXT文件中

#include<opencv2\opencv.hpp>
#include<io.h>
#include<fstream>

#define LOAD_PATH  "F:\\data"

using namespace cv;
using namespace std;

void DataFolder(string folderPath, ofstream &fout);

int main()
{
	vector<string>file_container;
	Mat srcImg;
	
	//遍历文件夹和子文件夹,并输出到txt
	ofstream ofs("sad.txt");
	DataFolder(File_Ergodicity,ofs);
	for (size_t i = 0; i < file_container.size(); i++)
	{
		srcImg = imread(file_container[i].c_str());
		imshow("图像", srcImg);
		waitKey(10);		
	}
	return 1;
}

/*遍历文件夹和子文件夹,并输出到txt*/
void DataFolder(string folderPath, ofstream &fout)
{
	_finddata_t FileInfo;
	string strfind = folderPath + "\\*";
	long Handle = _findfirst(strfind.c_str(), &FileInfo);

	if (Handle == -1L)
	{
		cerr << "can not match the folder path" << endl;
		exit(-1);
	}
	do {
		//判断是否有子目录
		if (FileInfo.attrib & _A_SUBDIR)
		{
			//这个语句很重要
			if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
			{
				string newPath = folderPath + "\\" + FileInfo.name;
				dfsFolder(newPath, fout);
			}
		}
		else
		{
			fout << folderPath << "\\" << FileInfo.name << " ";
		}
	} while (_findnext(Handle, &FileInfo) == 0);

	_findclose(Handle);
	fout.close();
	return;
}

猜你喜欢

转载自blog.csdn.net/m0_38134868/article/details/88394400
今日推荐