如何根据复选框选中的文件类型遍历某个通过浏览框选中的目录下的文件?

xixia07m 2017-07-06 11:11:59
在对话框界面上有5个复选框,分别是doc/docx, pdf , ppt/pptx, xls/xlsx, txt,选中了文件类型后才能开始点击“选择路径”按钮,出现浏览文件夹对话框,选择完路径后,Clistctrl控件就得到了选中的文件类型的遍历文件结果,通过文件名,创建时间,路径三列显示出来,请问我怎么编写这种通过复选框选中文件类型的遍历文件程序,请说说编写思路,最好能有代码提示。
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-12
  • 打赏
  • 举报
回复
xixia07m 2017-07-07
  • 打赏
  • 举报
回复
请问那如何编写通过选择复选框来筛选得到想要的文件类型的程序呢?遍历的find程序不需要破坏吧,只需要添加些代码就可以实现筛选功能了吧?
赵4老师 2017-07-07
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
xixia07m 2017-07-06
  • 打赏
  • 举报
回复

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);
	}
}
这是我的文件遍历程序,请问我如何能用复选框所选文件类型来左右文件遍历。
xixia07m 2017-07-06
  • 打赏
  • 举报
回复
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);     } } 
这是我的文件遍历程序,请问我如何能用复选框所选文件类型来左右文件遍历。
xixia07m 2017-07-06
  • 打赏
  • 举报
回复
请高手指教,多谢。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧