1. 程式人生 > >C++遍歷資料夾中的檔案並把結果儲存到csv中

C++遍歷資料夾中的檔案並把結果儲存到csv中

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();

}