VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 194|回复: 3

找不到指定的文件名,输入指定的文件名,只能找到当前目录下的指定文件名,无法遍历

[复制链接]
95_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-15 23:45:24 | 显示全部楼层 |阅读模式
这里分别是我的头文件和源文件,中间用很长的“\\”隔开了。利用多线程查找查找指定的文件名路径,只能找到当前根目录下的文件名路径并显示出来,也可以找到当前根目录下文件夹中指定的文件名,但是无法显示当前根目录下文件夹中指定的文件名的路径(在OnAddItem中进行报表插入显示)。是不是多线程还有什么没注意到的地方,望哪位大佬给我教教,一天了都没搞出来。


  1. /////// SearchFileDlg.h : 头文件
  2. //

  3. #pragma once
  4. #include "afxcmn.h"
  5. #define  WM_ON_ITEM (WM_USER+110)//自定义消息
  6. class CFileItem
  7. {
  8. public:
  9.         CString PathFile;
  10.         CString NameFile;
  11.         HWND m_MainDlg;
  12.         CFileItem()
  13.         {
  14.                 PathFile.Empty();
  15.                 NameFile.Empty();
  16.                 HWND m_MainDlg = NULL;
  17.         }
  18.         CFileItem(CFileItem &Item)
  19.         {
  20.                 PathFile = Item.PathFile;
  21.                 NameFile = Item.NameFile;
  22.                 HWND m_MainDlg = NULL;
  23.         }

  24. };
  25. // CSearchFileDlg 对话框
  26. class CSearchFileDlg : public CDialog
  27. {
  28. // 构造
  29. public:
  30.         CSearchFileDlg(CWnd* pParent = NULL);        // 标准构造函数

  31. // 对话框数据
  32.         enum { IDD = IDD_SEARCHFILE_DIALOG };

  33.         protected:
  34.         virtual void DoDataExchange(CDataExchange* pDX);        // DDX/DDV 支持


  35. // 实现
  36. protected:
  37.         HICON m_hIcon;

  38.         // 生成的消息映射函数
  39.         virtual BOOL OnInitDialog();
  40.         afx_msg void OnPaint();
  41.         afx_msg HCURSOR OnQueryDragIcon();
  42.         DECLARE_MESSAGE_MAP()
  43. public:
  44.         CListCtrl m_ListView;
  45.         afx_msg void OnLvnItemchangedList7(NMHDR *pNMHDR, LRESULT *pResult);
  46.         afx_msg void OnBnClickedBrowse();
  47.         afx_msg void OnBnClickedSearch();
  48.         afx_msg LRESULT OnAddItem(WPARAM wparam, LPARAM lparam);
  49. };
复制代码
  1. // SearchFileDlg.cpp : 实现文件
  2. //
  3. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SearchFile.h"
  6. #include "SearchFileDlg.h"
  7. #include "afxdialogex.h"

  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #endif


  11. // CSearchFileDlg 对话框
  12. CSearchFileDlg::CSearchFileDlg(CWnd* pParent /*=NULL*/)
  13.         : CDialog(CSearchFileDlg::IDD, pParent)
  14. {
  15.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  16. }

  17. void CSearchFileDlg::DoDataExchange(CDataExchange* pDX)
  18. {
  19.         CDialog::DoDataExchange(pDX);
  20.         DDX_Control(pDX, IDC_LIST7, m_ListView);
  21. }

  22. BEGIN_MESSAGE_MAP(CSearchFileDlg, CDialog)
  23.         ON_WM_PAINT()
  24.         ON_WM_QUERYDRAGICON()
  25.         ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST7, &CSearchFileDlg::OnLvnItemchangedList7)
  26.         ON_BN_CLICKED(IDC_BROWSE, &CSearchFileDlg::OnBnClickedBrowse)
  27.         ON_BN_CLICKED(IDC_SEARCH, &CSearchFileDlg::OnBnClickedSearch)
  28.         ON_MESSAGE(WM_ON_ITEM,&CSearchFileDlg::OnAddItem)
  29. END_MESSAGE_MAP()


  30. // CSearchFileDlg 消息处理程序

  31. BOOL CSearchFileDlg::OnInitDialog()
  32. {
  33.         CDialog::OnInitDialog();

  34.         // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
  35.         //  执行此操作
  36.         SetIcon(m_hIcon, TRUE);                        // 设置大图标
  37.         SetIcon(m_hIcon, FALSE);                // 设置小图标
  38.         m_ListView.SetExtendedStyle(m_ListView.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  39.         m_ListView.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 60);
  40.         m_ListView.InsertColumn(1, _T("查找结果"), LVCFMT_LEFT, 480);
  41.        
  42. #ifdef DEBUG
  43.         SetDlgItemText(IDC_EDIT3, _T("C:\\Intel\\ExtremeGraphics"));
  44.         SetDlgItemText(IDC_EDIT2, _T("54646.txt"));
  45. #endif // DEBUG

  46.         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  47. }
  48. #
  49. // 如果向对话框添加最小化按钮,则需要下面的代码
  50. //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
  51. //  这将由框架自动完成。

  52. void CSearchFileDlg::OnPaint()
  53. {
  54.         if (IsIconic())
  55.         {
  56.                 CPaintDC dc(this); // 用于绘制的设备上下文

  57.                 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  58.                 // 使图标在工作区矩形中居中
  59.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  60.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  61.                 CRect rect;
  62.                 GetClientRect(&rect);
  63.                 int x = (rect.Width() - cxIcon + 1) / 2;
  64.                 int y = (rect.Height() - cyIcon + 1) / 2;

  65.                 // 绘制图标
  66.                 dc.DrawIcon(x, y, m_hIcon);
  67.         }
  68.         else
  69.         {
  70.                 CDialog::OnPaint();
  71.         }
  72. }

  73. //当用户拖动最小化窗口时系统调用此函数取得光标
  74. //显示。
  75. HCURSOR CSearchFileDlg::OnQueryDragIcon()
  76. {
  77.         return static_cast<HCURSOR>(m_hIcon);
  78. }






  79. void CSearchFileDlg::OnLvnItemchangedList7(NMHDR *pNMHDR, LRESULT *pResult)
  80. {
  81.         LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  82.         // TODO:  在此添加控件通知处理程序代码
  83.         *pResult = 0;
  84. }


  85. void CSearchFileDlg::OnBnClickedBrowse()
  86. {
  87.         TCHAR szPath[MAX_PATH] = { 0 };
  88.         BROWSEINFO BroInfo = { 0 };
  89.         BroInfo.hwndOwner = m_hWnd;
  90.         ITEMIDLIST *pidl = SHBrowseForFolder(&BroInfo);//获取根目录
  91.                 if (SHGetPathFromIDList(pidl,szPath))
  92.                 {
  93.                         SetDlgItemText(IDC_EDIT3, szPath);
  94.                 }
  95.                 CoTaskMemFree(pidl);
  96.         // TODO:  在此添加控件通知处理程序代码
  97. }
  98. CRITICAL_SECTION g_Cs;
  99. UINT _cdecl ThreadProc(LPVOID lpParamater)
  100. {
  101.         CFileItem *FileItem = (CFileItem*)lpParamater;
  102.         CString StrRootPath = FileItem->PathFile;
  103.         if (StrRootPath[StrRootPath.GetLength() - 1] !='\\');
  104.         {
  105.                 StrRootPath = StrRootPath + _T("\");
  106.         }
  107.         CFileFind finder;
  108.         BOOL bret= finder.FindFile(StrRootPath+_T("*.*"));
  109.         while (bret)
  110.         {
  111.                 bret = finder.FindNextFile();
  112.                 if (finder.IsDots())
  113.                 {
  114.                         //查找到的是.或者..
  115.                         continue;
  116.                 }
  117.                 else if (finder.IsDirectory())
  118.                 {
  119.                         CFileItem *SubFileItem = new CFileItem(*FileItem);
  120.                         SubFileItem->PathFile = finder.GetFilePath();
  121.                         AfxBeginThread(ThreadProc, SubFileItem);
  122.                         //查找的是文件,开启多线程

  123.                 }
  124.                 else
  125.                 {
  126.                         CString strFileName = finder.GetFileName();
  127.                         if (strFileName.CompareNoCase(FileItem->NameFile)==0)
  128.                         {
  129.                                 CString strFilePath = finder.GetFilePath();
  130.                
  131.                                 SendMessage(FileItem->m_MainDlg, WM_ON_ITEM, 0,(LPARAM)(LPCTSTR)strFilePath);
  132.                                        
  133.                         }
  134.                         //进行文件名的比对:
  135.                 }
  136.         }
  137.         delete FileItem;
  138.         return 0;
  139. }

  140. void CSearchFileDlg::OnBnClickedSearch()
  141. {
  142.         CFileItem *CFN = new CFileItem();
  143.         InitializeCriticalSection(&g_Cs);
  144.         CFN->m_MainDlg = GetSafeHwnd();
  145.         GetDlgItemText(IDC_EDIT3, CFN->PathFile);
  146.         GetDlgItemText(IDC_EDIT2, CFN->NameFile);
  147.         m_ListView.DeleteAllItems();
  148.         AfxBeginThread(ThreadProc, CFN);
  149.         // TODO:  在此添加控件通知处理程序代码
  150. }
  151. int idx = 1;
  152. int idy = 0;
  153. LRESULT CSearchFileDlg::OnAddItem(WPARAM wparam, LPARAM lparam)//消息响应函数
  154. {
  155.         CString strPath = (LPCTSTR)lparam;
  156.         CString szCoutx = 0;
  157.         szCoutx.Format(_T("%d"), idx);
  158.         m_ListView.InsertItem(m_ListView.GetItemCount(), szCoutx);
  159.         idx++;
  160.         m_ListView.SetItemText( idy,1, strPath);
  161.         idy++;
  162.         return TRUE;
  163. }
复制代码


2.png
1.png




上一篇:MFC时间转换问题
下一篇:关于虚函数和多态性的问题
51_avatar_middle
最佳答案
82 
online_admins 发表于 2020-4-16 16:54:03 | 显示全部楼层
改了两个地方:
ThreadProc 中的:
StrRootPath = StrRootPath + _T("\");
改成:
StrRootPath = StrRootPath + _T("\\");

CFileItem(CFileItem &Item) 函数中的:
HWND m_MainDlg = NULL;
改成:
m_MainDlg = Item.m_MainDlg;
95_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-17 19:46:55 | 显示全部楼层
知道了,谢谢老师
95_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-17 19:49:44 | 显示全部楼层
你的教材真的很棒!!!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-22 17:05

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表