C++遍历文件夹中的文件并把结果保存到csv中

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanyuqiu/article/details/74540845

StaDir.h文件

#pragma once
#include "browsedir.h"
class CStaDir :
	public CBrowseDir
{
public:
	CStaDir(void);
	~CStaDir(void);
	int m_nFileCount;		//保存文件个数
	int m_nSubdirCount;		//保存目录个数

	int GetFileCount(void);
	int GetSubdirCount(void);
	virtual bool ProcessFile(const char* filename);
	virtual void ProcessDir(const char* currentdir, const char* parentdir);
};

StaDir.cpp文件

#include "StdAfx.h"
#include "StaDir.h"


CStaDir::CStaDir(void)
	: m_nFileCount(0)
	, m_nSubdirCount(0)
{
}


CStaDir::~CStaDir(void)
{
}

/************************************************************************/
/* 返回文件个数                                                      */
/************************************************************************/
int CStaDir::GetFileCount(void)
{
	return m_nFileCount;
}

/************************************************************************/
/* 返回子目录个数                                                      */
/************************************************************************/
int CStaDir::GetSubdirCount(void)
{
	//因为进入初始目录时,也会调用函数ProcessDir,所以减1后才是真正的子目录个数
	return m_nSubdirCount-1;
}

/************************************************************************/
/* 覆写虚函数procefile,没调用一次,文件个数加1                       */
/************************************************************************/
bool CStaDir::ProcessFile(const char* filename)
{
	m_nFileCount++;
	return CBrowseDir::ProcessFile(filename);
}

/************************************************************************/
/* 覆写虚函数ProcessDir,没调用一次,目录个数加1                                                                     */
/************************************************************************/
void CStaDir::ProcessDir(const char* currentdir, const char* parentdir)
{
	m_nSubdirCount++;
	CBrowseDir::ProcessDir(currentdir,parentdir);
}

BrowseDir.cpp



#pragma once
/************************************************************************/
/* 遍历目录中的所有文件                                                      */
/************************************************************************/
#include <stdlib.h>
#include <direct.h>
#include <string>
#include <io.h>
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class CBrowseDir
{
public:
	CBrowseDir(void);
	~CBrowseDir(void);
	char	m_szInitDir[_MAX_PATH];		//初始目录的绝对路径,以'\'结尾

	bool SetInitDir(const char* dir);	
	bool BeginBrowse(const char* filespec);
	bool BrowseDir(const char* dir, const char* filespec);
	virtual bool ProcessFile(const char* filename);
	virtual void ProcessDir(const char* currentdir,const char *parentdir);
	vector<string> BeginBrowseFilenames(const char* filespec);
	vector<string> GetDirFilenames(const char* dir, const char* filespec);
};

BrowseDir.cpp文件

#include "StdAfx.h"
#include "BrowseDir.h"


CBrowseDir::CBrowseDir(void)
{
	getcwd(m_szInitDir,_MAX_PATH);	//用当前目录初始化m_szInitDir

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len = strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
	{
		strcat(m_szInitDir,"\\");
	}
}


CBrowseDir::~CBrowseDir(void)
{
}

/************************************************************************/
/* 设置初始目录为dir,如果返回false,表示目录不可用                         */
/************************************************************************/
bool CBrowseDir::SetInitDir(const char* dir)
{
	//先把dir转换为绝对路径
	if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)	
	{
		return false;
	}

	//判断目录是否存在
	if (_chdir(m_szInitDir) != 0)
	{
		return false;
	}

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len = strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
	{
		strcat(m_szInitDir,"\\");
	}
	return true;
}

/************************************************************************/
/* 开始遍历初始目录及其子目录下由filespec指定类型的文件,
filespec开始使用通配符*?,不能包含路径。
如果返回false,表示遍历过程被用户终止*/
/************************************************************************/
bool CBrowseDir::BeginBrowse(const char* filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return BrowseDir(m_szInitDir,filespec);
}
/************************************************************************/
/* 遍历目录dir下由filespec指定的文件,
对于子目录,采用迭代的方法
如果返回false,表示终止遍历文件*/
/************************************************************************/
bool CBrowseDir::BrowseDir(const char* dir, const char* filespec)
{
	_chdir(dir);

	//首先查找dir中符合要求的文件
	long			hFile;
	_finddata_t		fileinfo;
	if ((hFile = _findfirst(filespec,&fileinfo)) != -1)
	{
		do 
		{
			//检查是不是目录,如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				if (!ProcessFile(filename))
				{
					return false;
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}

	//查找dir中的子目录,因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
	//当前目录,因此还要重新设置当前目录为dir
	//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录,对_findnext没有影响
	_chdir(dir);
	if ((hFile = _findfirst("*.*",&fileinfo)) != -1)
	{
		do 
		{
			//检查是不是目录,如果是,再检查是不是.或 ..,如果不是,进行迭代
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".")!=0 
					&& strcmp(fileinfo.name,"..")!= 0)
				{
					char subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					if (!BrowseDir(subdir,filespec))
					{
						return false;
					}
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	return true;
}

/************************************************************************/
/* 函数BrowseDir每找到一个文件,就调用ProcessFile,
并把文件名作为参数传递下去
如果返回false,表示终止遍历文件,用户可以覆写该函数,加入自己的处理代码*/
/************************************************************************/
bool CBrowseDir::ProcessFile(const char* filename)
{
	return true;
}
void CBrowseDir::ProcessDir(const char* currentdir,const char *parentdir)
{

}

vector<string> CBrowseDir::BeginBrowseFilenames(const char* filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return GetDirFilenames(m_szInitDir,filespec);
}


vector<string> CBrowseDir::GetDirFilenames(const char* dir, const char* filespec)
{
	_chdir(dir);
	vector<string>filename_vector;
	filename_vector.clear();

	//首先查找dir中符合要求的文件
	long	hFile;
	_finddata_t	fileinfo;
	if ((hFile = _findfirst(filespec,&fileinfo)) != -1)
	{
		do 
		{
			//检查是不是目录
			//如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char	filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				filename_vector.push_back(filename);
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}

	//查找dir中的目录,因为在处理dir中的文件时,派生类的ProcessFile有可能改变了当前目录,
	//因此还要重新设置当前目录为dir,执行过_findfirst后,可能系统记录下了相关信息,因此改变了目录对_findnext没有影响
	_chdir(dir);
	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do 
		{
			//检查是不是目录,如果是,再检查是不是.或..,如果不是,则进行迭代
			if (fileinfo.attrib & _A_SUBDIR)
			{
				if (strcmp(fileinfo.name,".")!=0
					&& strcmp(fileinfo.name,"..")!=0)
				{
					char  subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					vector<string>tmp = GetDirFilenames(subdir,filespec);
					for (vector<string>::iterator it = tmp.begin(); it<tmp.end(); it++)
					{
						filename_vector.push_back(*it);
					}
				}
			}

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

}

调用函数

 
 
void CsysDlg::OnBnClickedOpen()
{
	// TODO: Add your control notification handler code here
	char		cBuf[256];
	IplImage	*pSourcImg,*pSegImg=NULL;
	int			nWidth,nHeight,nSum,i,j,nInder,nCount=0;
	float		fRate;
	const char *fname;
	CStaDir statdir;
	strcpy(cBuf,"E:\\2012");

	if (!statdir.SetInitDir(cBuf))	//设置要遍历的目录
	{
		return;
	}
	//开始遍历,并计算,把值及文件名写入
	vector<string>file_vec = statdir.BeginBrowseFilenames("*.jpg");
	statdir.BeginBrowse("*.jpg");
	ofstream outfile;
	outfile.open("D:\\result.csv",ios::out);
	for (vector<string>::const_iterator it=file_vec.begin(); it<file_vec.end(); ++it)
	{
		fname = it->data();
		pSourcImg = cvLoadImage(fname,1);
		nWidth = pSourcImg->width;
		nHeight = pSourcImg->height;
		if(pSegImg == NULL)
		{
			pSegImg = cvCreateImage(cvSize(nWidth,nHeight),IPL_DEPTH_8U,1);
		}
		SegmentationImg(pSourcImg, pSegImg);
		nSum = 0;
		for (i=0;i<nHeight;i++)
		{
			nInder = i*nWidth;
			for (j=0;j<nWidth;j++)
			{
				nSum += pSegImg->imageData[nInder+j] & 0x01;
			}
		}
		fRate = (float)nSum / (float)(nWidth*nHeight);
		outfile<<*it<<","<<fRate<<endl;
		cvReleaseImage(&pSourcImg);
		//outfile<<*it<<endl;
		nCount++;
	}

	outfile.close();

}



 

猜你喜欢

转载自blog.csdn.net/guanyuqiu/article/details/74540845