VC++/MFC 小程序 文件/目录对话框 递归遍历文件/文件夹

来源:互联网 发布:php幸运大转盘源码 编辑:程序博客网 时间:2024/05/16 18:16
// FileDlg.cpp : implementation file//#include "stdafx.h"#include "mfcLab4.h"#include "FileDlg.h"#include "FileLoader.h"// FileDlg dialogIMPLEMENT_DYNAMIC(FileDlg, CDialog)FileDlg::FileDlg(CWnd* pParent /*=NULL*/): CDialog(FileDlg::IDD, pParent){}FileDlg::~FileDlg(){}void FileDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(FileDlg, CDialog)ON_BN_CLICKED(IDC_OPENFILE, &FileDlg::OnBnClickedOpenfile)ON_BN_CLICKED(IDC_SELFILES, &FileDlg::OnBnClickedSelfiles)END_MESSAGE_MAP()// FileDlg message handlers////递归查找文件void FileDlg::FindFiles(CTreeCtrl* m_Tree,HTREEITEM root,HTREEITEM parent,CString strPath,int deep){if(deep > 10){return;}CString strWildcard(strPath);     strWildcard += _T("\\*.*");   CFileFind ff;   BOOL bFind = ff.FindFile(strWildcard);   while(bFind)   {      bFind = ff.FindNextFile();      if (ff.IsDots() || ff.IsSystem() || ff.IsHidden())         continue;            if (ff.IsDirectory())      {CString dir = ff.GetFilePath();HTREEITEM currentNode;if(parent==NULL){currentNode = m_Tree->InsertItem(dir,NULL,NULL,root);}else{currentNode = m_Tree->InsertItem(dir,NULL,NULL,parent);}this->FindFiles(m_Tree,root,currentNode,dir,++deep);      }      else      {         CString strFileName = ff.GetFileName();if(parent==NULL){m_Tree->InsertItem(strFileName,NULL,NULL,root);}else{m_Tree->InsertItem(strFileName,NULL,NULL,parent);}       }   }}void FileDlg::OnBnClickedOpenfile(){// TODO: Add your control notification handler code here}////对话框====================================////打开文件对话框void FileDlg::OpenFileDialog(){CFileDialog dlg(TRUE, NULL, NULL,           OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,           NULL);    if(dlg.DoModal() == IDOK)    {          CString szFilename = dlg.GetPathName();CFile f;f.Open(szFilename,CFile::modeReadWrite);char* buf = new char[f.GetLength() + 1];buf[f.GetLength()] = 0;f.Read(buf,f.GetLength());f.Close();CString s(buf);GetDlgItem(IDC_EDIT1)->SetWindowTextW(s);delete[] buf;    }}////打开目录对话框void FileDlg::OpenDirDialog(){CString strP =_T("选择目录");  int length = 1024;LPWSTR szPath = strP.GetBuffer(1024);// do something with the string that pwsz points to.strP.ReleaseBuffer();    CString str;    BROWSEINFO bi;       bi.hwndOwner = m_hWnd;       bi.pidlRoot = NULL;       bi.pszDisplayName = szPath;       bi.lpszTitle = _T("请选择要遍历的目录:");       bi.ulFlags = 0;       bi.lpfn = NULL;       bi.lParam = 0;       bi.iImage = 0;       //弹出选择目录对话框    LPITEMIDLIST lp = SHBrowseForFolder(&bi);      if(lp && SHGetPathFromIDList(lp,szPath))       {CTreeCtrl* m_Tree = (CTreeCtrl*)GetDlgItem(IDC_FILETREE);////设置样式m_Tree->ModifyStyle(NULL,TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT); HTREEITEM root = m_Tree->InsertItem(szPath,NULL,NULL);///root就是节点的标题this->FindFiles(m_Tree,root,NULL,szPath,0);    }else {        AfxMessageBox(_T("无效的目录,请重新选择"));  }}//=======================================void FileDlg::OnBnClickedSelfiles(){this->OpenDirDialog();// TODO: Add your control notification handler code here}