用这段代码,读取指定文件夹内的文件,需要把第几行的代码改为路径 本人超级新手 是把8, 23, 31这几行改为文件夹路径吗?可是我这样改完以后,点击生成界面的按钮出现错误信息“exe遇到问题需要关闭,深感抱歉” 我的文件夹路径写的是"E:\\200" 看看有什么问题1
  2 void CFileSearchDlg::TraverseFolder( const CString& strDir,std::vector<CString>& vecFile )
  3 {
  4 WIN32_FIND_DATA FindFileData;
  5
  6 CString strDirTmp;
  7 strDirTmp = strDir;
  8 strDirTmp += "\\*.*";
  9
  10 HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData);
  11 if(INVALID_HANDLE_VALUE == hFind)
  12 {
  13 return;
  14 }
  15
  16 while(TRUE)
  17 {
  18 if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  19 {
  20 if(FindFileData.cFileName[0]!= _T('.'))
  21 {
  22 strDirTmp = strDir;
  23 strDirTmp += "\\";
  24 strDirTmp += FindFileData.cFileName;
  25 TraverseFolder(strDirTmp,vecFile) ;
  26 }
  27 }
  28 else
  29 {
  30 strDirTmp = strDir;
  31 strDirTmp += "\\";
  32 strDirTmp += FindFileData.cFileName;
  33 vecFile.push_back(strDirTmp);
  34 }
  35 if(!FindNextFile(hFind,&FindFileData)) break;
  36 }
  37 FindClose(hFind);
  38
  39 }

解决方案 »

  1.   

    void CFileSearchDlg::TraverseFolder( const CString& strDir,std::vector<CString>& vecFile )strDir是你传入的路径
      

  2.   

    你在按钮事件响应中
    CString strPath=“E:\\200”;
    调用那个函数的时候把strPath作为参数传入或者你也可以通过CFileDialog找到你需要的路径,然后传入
      

  3.   

    用CFileDialog是怎么做的啊,应该怎么用向导啊 拜托您了 现在真的很急
      

  4.   

    CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
    "所有文件(*.*)", NULL/*AfxGetMainWnd()*/);
         if(mFileDlg.DoModal()==IDOK)
     {
          m_strPathName=mFileDlg.GetPathName();
      m_strFileName=mFileDlg.GetFileName();
     }
      

  5.   

    我现在使用mfc生成了一个对话框,上面有一个按钮,按钮的响应函数是那段读取文件的代码,现在需要文件夹路径,你给我的那段代码需要拷贝到哪里?
    我现在着急用,真的是太感谢您了
      

  6.   

    放在OnButton的开始部分,你那段代码之前你肯定要先得到路径,然后调用你那个函数啊
    其他的你自己查MSDN吧
      

  7.   

    是新建一个按钮,然后添加到响应函数中吗? 我这样做了 可是出错信息:'m_strPathName' : undeclared identifier
      

  8.   

    CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
    "所有文件(*.*)|*.*", NULL/*AfxGetMainWnd()*/);     if(mFileDlg.DoModal()==IDOK)
     {
          CString strPathName=mFileDlg.GetPathName();
          CString strDir = strPathName.Left(strPathName.ReverseFind('\\'));
          std::vector<CString> vecFile;
          TraverseFolder( strDir,vecFile );
     }
      

  9.   


    实在是太谢谢您了,这两段代码可以结合运行了,可是点完浏览框的打开按钮之后 再点击上面的叉号关闭就会出现“exe遇到问题需要关闭,深感抱歉的字样” 不知道为何
    另外我还想处理读取到的文件,是不是在响应函数某尾 把vector内的元素倒出来处理就行了?这是结合完的响应函数:
    void CTestDlg::OnTraverseFolder(const CString& strDir, vector<CString>& vecFile)
    {
    // TODO: Add your control notification handler code hereCFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
    "所有文件(*.*)|*.*", NULL/*AfxGetMainWnd()*/);  if(mFileDlg.DoModal()==IDOK)
    {
      CString strPathName=mFileDlg.GetPathName();
      CString strDir = strPathName.Left(strPathName.ReverseFind('\\'));
      std::vector<CString> vecFile;
      OnTraverseFolder( strDir,vecFile );
    }
        WIN32_FIND_DATA FindFileData;
    CString strDirTmp;
    strDirTmp = strDir;
    strDirTmp += "\\*.*";
    HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)
    {
    return;
    }
    while(TRUE)
    {
    if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    if(FindFileData.cFileName[0]!= _T('.'))
    {
    strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    OnTraverseFolder(strDirTmp,vecFile) ;
    }
    }
    else
    {
    strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    vecFile.push_back(strDirTmp);
    }
    if(!FindNextFile(hFind,&FindFileData)) break;
    }
     FindClose(hFind);
    }
      

  10.   

    这样是不是就对了? 实在不好意思,麻烦你了void CTestDlg::OnButton1() 
    { CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
    "所有文件(*.*)|*.*", NULL/*AfxGetMainWnd()*/);

    if(mFileDlg.DoModal()==IDOK)
    {
    CString strPathName=mFileDlg.GetPathName();
    CString strDir = strPathName.Left(strPathName.ReverseFind('\\'));
    std::vector<CString> vecFile;
    OnTraverseFolder( strDir,vecFile );
    } void CTestDlg::OnTraverseFolder(const CString& strDir,std::vector<CString>& vecFile) 
    {
    WIN32_FIND_DATA FindFileData;
    CString strDirTmp;
    strDirTmp = strDir;
    strDirTmp += "\\*.*";
    HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)
    {
    return;
    }
    while(TRUE)
    {
    if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    if(FindFileData.cFileName[0]!= _T('.'))
    {
    strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    OnTraverseFolder(strDirTmp,vecFile) ;
    }
    }
    else
    {
    strDirTmp = strDir;
    strDirTmp += "\\";
    strDirTmp += FindFileData.cFileName;
    vecFile.push_back(strDirTmp);
    }
    if(!FindNextFile(hFind,&FindFileData)) break;
    }
       FindClose(hFind);

    }

    }
      

  11.   

    不好意思,还有一个问题,我这样运行之后,点击按钮,运行出浏览框,然后我找到目的文件夹,然后再点浏览框下的打开按钮,是不是整个文件夹内的所有图片就都被我读取到vector里了?不过我觉得如果读取成功的话,浏览框应该关闭啊,但是现在不关闭,只有我选取其中的一个图片双击 浏览框才能关闭
    我的目的是把整个文件夹内的图片都读取到vector中,以便后续处理图片啊