1、浏览文件夹并记住上次选择目录
static TCHAR szDir[MAX_PATH] ; int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) { LPITEMIDLIST tmp = (LPITEMIDLIST)lParam; switch (uMsg) { case BFFM_INITIALIZED: SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData); break; case BFFM_SELCHANGED: TCHAR buffer[MAX_PATH]; if (SHGetPathFromIDList((LPITEMIDLIST) tmp ,buffer)) { SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buffer); } break; default: break; } return 0; } void OnBnClicked(UINT id) { // TODO: 在此添加控件通知处理程序代码 BROWSEINFO bi; memset(&bi, 0 , sizeof(bi)); TCHAR Buffer[MAX_PATH] = {0}; bi.hwndOwner = NULL; bi.pidlRoot =NULL;//初始化制定的root目录很不容易 bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框 bi.lpszTitle = _T("选择文件路径"); bi.ulFlags = BIF_STATUSTEXT;//包括文件 bi.lpfn = BrowseCallbackProc; bi.iImage=IDR_MAINFRAME; bi.lParam = (LPARAM)szDir; //初始化入口参数bi结束 LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框 if(pIDList) { SHGetPathFromIDList(pIDList, Buffer); memcpy(szDir, Buffer, MAX_PATH); switch (id) { case IDC_INPUT: m_strInput = Buffer; break; case IDC_OUTPUT: m_strOutput = Buffer; break; default: break; } UpdateData(FALSE); } // free memory used IMalloc * imalloc = 0; if ( SUCCEEDED(SHGetMalloc( &imalloc))) { imalloc->Free (pIDList); imalloc->Release(); } }
2、递归遍历目录下的文件
void RecursiveSearchDir(CString path) { WIN32_FIND_DATA wData; memset(&wData, 0, sizeof(WIN32_FIND_DATA)); CString strFind = path + _T("\\*.*"); HANDLE hFind = FindFirstFile(strFind, &wData); if (INVALID_HANDLE_VALUE == hFind) { return; } do { if (CString(wData.cFileName).CompareNoCase(_T(".")) && CString(wData.cFileName).CompareNoCase(_T(".."))) { if (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { RecursiveSearchDir(path + _T("\\") + wData.cFileName); } else { CString fileName(path + _T("\\") + wData.cFileName); m_vecInput.push_back(fileName); } } } while ( FindNextFile(hFind, &wData)); }