16,472
社区成员
发帖
与我相关
我的任务
分享
void find(LPCTSTR lpPath,vector<FileInfo>& FileList)
{
string szFind(lpPath);
WIN32_FIND_DATA FindFileData;
szFind+=_T("\\*.*");
HANDLE hFind=::FindFirstFile(szFind.c_str(),&FindFileData);
if(INVALID_HANDLE_VALUE==hFind) return;
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{// dir 目录 在 列表中 可以 双击 打开 ,不要 递归 !
if(FindFileData.cFileName[0] != '.')
{
string szPath(lpPath);
szPath+=_T("\\");
szPath+=FindFileData.cFileName;
TRACE1("%s\n",szPath.c_str());
// find(szPath.c_str(),FileList);
}
}
else
{// file
string strFileName=FindFileData.cFileName;//文件名
string suffixStr=strFileName.substr(strFileName.find_last_of('.')+1);
// if(suffixStr.c_str() == _T("txt")) //根据后缀选出自己感兴趣的文件,比如txt文件,注意大小写,如果想不区分大小写,需要自己统一转化为大写或小写然后比较
{
FILETIME ft=FindFileData.ftCreationTime; //取得创建时间
SYSTEMTIME st={0};
TCHAR buf[64]={0};
FileTimeToLocalFileTime(&(FindFileData.ftCreationTime),&ft); //转换成本地时间
FileTimeToSystemTime(&ft,&st); //在这句之前加上上一句,就不用再小时那里+8了。
sprintf(buf,_T("%4d年%02d月%02d日%02d:%02d:%02d"),st.wYear,st.wMonth,st.wDay,st.wHour/*北京时间*/,st.wMinute,st.wSecond);
string strFilePath=lpPath;
strFilePath+=_T("\\");
strFilePath+=FindFileData.cFileName; //文件全路径名
FileInfo fi;
fi.szFileName=strFileName;
fi.szFilePath=strFilePath;
fi.szCreateTime=buf;
TRACE1("%s\n",strFileName.c_str());
FileList.push_back(fi);
}
}
} while (::FindNextFile (hFind, &FindFileData));
}
#define BIF_NEWDIALOGSTYLE 0x0040
void CShowdirDlg::OnButton1()
{
// TODO: Add your control notification handler code here
BROWSEINFO bi; //BROWSEINFO结构有很多成员参数可以自己设置
ZeroMemory(&bi,sizeof(BROWSEINFO)); //将以&bi为起始地址,大小为sizeof(BROWSEINFO)的内存区域用0填充
bi.ulFlags=BIF_BROWSEINCLUDEFILES; //设置弹出的对话框属性。此处意思为包含文件。如果不设这个值,默认的是只有文件夹。ulFlags还可以定义很多别的属性
bi.ulFlags=BIF_NEWDIALOGSTYLE; //窗口可以调整大小,有新建文件夹按钮
bi.lpszTitle="指定要处理的文件夹"; //在窗口内显示提示用户的语句
LPITEMIDLIST pidl = SHBrowseForFolder(&bi); //Displays a dialog box enabling the user to select a Shell folder.
TCHAR * path = new TCHAR[MAX_PATH];
if(pidl != NULL)
{
SHGetPathFromIDList(pidl,path); //Converts an item identifier list to a file system path
// MessageBox(path);
}
vector<FileInfo>fileList;
find(path,fileList); //取得文件信息,可自行插入列表框
UINT nCount=fileList.size(); //得到控件的行数
UINT i;
CString empty;
CString name;
CString time;
CString mypath;
for(i=0;i<nCount;i++)
{
empty.Format("%d",i);
m_list.InsertItem(i,empty);
name.Format("%s",fileList[i].szFileName.c_str());
m_list.SetItemText(i,1,name);
time.Format("%s",fileList[i].szCreateTime.c_str());
m_list.SetItemText(i,2,time);
mypath.Format("%s",fileList[i].szFilePath.c_str());
m_list.SetItemText(i,3,mypath);
}
}
这是我的文件遍历程序,请问我如何能用复选框所选文件类型来左右文件遍历。void find(LPCTSTR lpPath,vector<FileInfo>& FileList) { string szFind(lpPath); WIN32_FIND_DATA FindFileData; szFind+=_T("\\*.*"); HANDLE hFind=::FindFirstFile(szFind.c_str(),&FindFileData); if(INVALID_HANDLE_VALUE==hFind) return; do { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {// dir 目录 在 列表中 可以 双击 打开 ,不要 递归 ! if(FindFileData.cFileName[0] != '.') { string szPath(lpPath); szPath+=_T("\\"); szPath+=FindFileData.cFileName; TRACE1("%s\n",szPath.c_str()); // find(szPath.c_str(),FileList); } } else {// file string strFileName=FindFileData.cFileName;//文件名 string suffixStr=strFileName.substr(strFileName.find_last_of('.')+1); // if(suffixStr.c_str() == _T("txt")) //根据后缀选出自己感兴趣的文件,比如txt文件,注意大小写,如果想不区分大小写,需要自己统一转化为大写或小写然后比较 { FILETIME ft=FindFileData.ftCreationTime; //取得创建时间 SYSTEMTIME st={0}; TCHAR buf[64]={0}; FileTimeToLocalFileTime(&(FindFileData.ftCreationTime),&ft); //转换成本地时间 FileTimeToSystemTime(&ft,&st); //在这句之前加上上一句,就不用再小时那里+8了。 sprintf(buf,_T("%4d年%02d月%02d日%02d:%02d:%02d"),st.wYear,st.wMonth,st.wDay,st.wHour/*北京时间*/,st.wMinute,st.wSecond); string strFilePath=lpPath; strFilePath+=_T("\\"); strFilePath+=FindFileData.cFileName; //文件全路径名 FileInfo fi; fi.szFileName=strFileName; fi.szFilePath=strFilePath; fi.szCreateTime=buf; TRACE1("%s\n",strFileName.c_str()); FileList.push_back(fi); } } } while (::FindNextFile (hFind, &FindFileData)); } #define BIF_NEWDIALOGSTYLE 0x0040 void CShowdirDlg::OnButton1() { // TODO: Add your control notification handler code here BROWSEINFO bi; //BROWSEINFO结构有很多成员参数可以自己设置 ZeroMemory(&bi,sizeof(BROWSEINFO)); //将以&bi为起始地址,大小为sizeof(BROWSEINFO)的内存区域用0填充 bi.ulFlags=BIF_BROWSEINCLUDEFILES; //设置弹出的对话框属性。此处意思为包含文件。如果不设这个值,默认的是只有文件夹。ulFlags还可以定义很多别的属性 bi.ulFlags=BIF_NEWDIALOGSTYLE; //窗口可以调整大小,有新建文件夹按钮 bi.lpszTitle="指定要处理的文件夹"; //在窗口内显示提示用户的语句 LPITEMIDLIST pidl = SHBrowseForFolder(&bi); //Displays a dialog box enabling the user to select a Shell folder. TCHAR * path = new TCHAR[MAX_PATH]; if(pidl != NULL) { SHGetPathFromIDList(pidl,path); //Converts an item identifier list to a file system path // MessageBox(path); } vector<FileInfo>fileList; find(path,fileList); //取得文件信息,可自行插入列表框 UINT nCount=fileList.size(); //得到控件的行数 UINT i; CString empty; CString name; CString time; CString mypath; for(i=0;i<nCount;i++) { empty.Format("%d",i); m_list.InsertItem(i,empty); name.Format("%s",fileList[i].szFileName.c_str()); m_list.SetItemText(i,1,name); time.Format("%s",fileList[i].szCreateTime.c_str()); m_list.SetItemText(i,2,time); mypath.Format("%s",fileList[i].szFilePath.c_str()); m_list.SetItemText(i,3,mypath); } }
这是我的文件遍历程序,请问我如何能用复选框所选文件类型来左右文件遍历。