1. 程式人生 > >C++遍歷路徑下的所有文件

C++遍歷路徑下的所有文件

highlight true file bsp char 函數 cmp ron 標識

intptr_t類型用於記錄文件夾句柄,註意該類型不是指針類型,而是int型的重定義。

_finddata_t結構體類型用於記錄文件信息。

_finddata_t結構體定義如下

struct _finddata_t {

unsigned attrib;        // 存儲文件屬性
__time64_t time_create;     // 存儲文件創建時間
__time64_t time_access;     // 存儲文件最後一次被訪問的時間
__time64_t time_write;      // 存儲文件最後一次被修改的時間
_fsize_t size;          // 存儲文件的大小
char name[260];        // 存儲文件名稱

};

_findfirst()函數

_findfirst()函數原型如下:

intptr_t _findfirst(

  const char *filespec,      // 目標文件

  struct _finddata_t *fileinfo    // 用於存儲文件信息的_finddata_t結構體

);

函數如果成功,返回一個唯一的搜索句柄標識一個或一組和filespec說明匹配的文件,可以用於接下來的_findnext()和_findclose()函數。
否則_findfirst()返回-1。


_findnext()函數
_findnext()函數原型如下:

int _findnext(
    intptr_t handle,            // 搜索句柄,通過_findfirst()函數獲得
    struct _finddata_t *fileinfo     // 用於存儲文件信息的_finddata_t結構體
);
函數如果成功,返回0,否則返回-1。如果沒有更多能夠找到的文件了,也會導致失敗。

_findclose()函數
原型如下:
int _findclose(
    intptr_t handle    // 搜索句柄
);
該函數用於關閉搜索句柄


代碼如下:
void CDlg::OnBnClickedOk()
{
	// TODO:  在此添加控件通知處理程序代碼
	UpdateData(TRUE);
	m_ListFile.ResetContent();

	// 寬字節轉多字節
	char *pPathBuf = NULL;
	int PathBufSize = WideCharToMultiByte(0, 0, m_szPath.GetBuffer(), m_szPath.GetLength(), pPathBuf, 0, NULL, NULL);
	if (PathBufSize <= 0)
		m_ListFile.AddString(_T("獲取多字節緩沖區大小錯誤"));
	pPathBuf = new char[PathBufSize + 1];
	memset(pPathBuf, 0, PathBufSize + 1);
	WideCharToMultiByte(0, 0, m_szPath.GetBuffer(), m_szPath.GetLength(), pPathBuf, PathBufSize + 1, 0, 0);
	if (strlen(pPathBuf) <= 0)
		m_ListFile.AddString(_T("寬字節轉多字節錯誤"));

	queue<string> *pVect = new queue<string>;
	if (GetPathFile(pPathBuf, pVect) == false)
		m_ListFile.AddString(_T("遍歷目錄下的所有文件失敗!"));
	else{
		while (!pVect->empty())
		{
			string szFileName = pVect->front();
			LPWSTR pBuf = NULL;
			int nLen = MultiByteToWideChar(0, 0, (char*)szFileName.c_str(), szFileName.length(), pBuf, 0);
			if (nLen > 0)
			{
				pBuf = new TCHAR[nLen + 1];
				memset(pBuf, 0, sizeof(TCHAR)* (nLen + 1));
				MultiByteToWideChar(0, 0, (char*)szFileName.c_str(), szFileName.length(), pBuf, nLen);
				m_ListFile.AddString(pBuf);
				delete[] pBuf;
				pBuf = NULL;
			}
			pVect->pop();
		}
	}

	delete[] pPathBuf;
	pPathBuf = NULL;
	UpdateData(FALSE);
}


bool CDlg::GetPathFile(const char* pPath, queue<string> *pVect)
{
	if (!pPath || !pPath)
		return false;
	char* szPath = new char[128];
	memset(szPath, 0, 128);
	_snprintf_s(szPath, 128, 128, "%s\\*.*", pPath);
	intptr_t Handle;				
	_finddata_t FindData;			
	Handle = _findfirst(szPath, &FindData);
	if (Handle == -1)
		return false;	
	do 
	{
		if (strcmp(FindData.name, ".") != 0 && strcmp(FindData.name, "..") != 0)
		{
			pVect->push(FindData.name);
			if (strrchr(FindData.name, ‘.‘) == NULL)
			{
				string sz = pPath;
				sz += "\\";
				sz += FindData.name;
				GetPathFile(sz.c_str(), pVect);
			}
		}
	} while (_findnext(Handle, &FindData) == 0);
	_findclose(Handle);
	delete[] szPath;
	szPath = NULL;
	return true;
}

  



C++遍歷路徑下的所有文件