C++遍歷資料夾中的檔案並把結果儲存到csv中
阿新 • • 發佈:2018-12-24
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();
}