情况是这样:
     用CFileFind遍历文件后,然后用CFileStatus得到文件属性,如遍历到正在使用的文件,就出错了,然后不往下面走。我猜CFileFind是可以遍历到正在使用的文件,只是CFile::GetStatus不能得到正在使用的文件的属性,但我又想得到属性,怎么处理?
     另一个问题,想用“Windows 图片和传真查看器”打开文件个,结果“Windows 图片和传真查看器”不是个exe程序,是用dll插入到Explorer.exe中的,想打开这个文件怎么处理?
     还有一个问题,比如找到一个rmvb文件,用相应播放器打开,可我又装了“暴风影音”“百度影音”“QQ影音”,怎么选择?还有就是我不知道别人电脑上安装了什么播放器,但我想用其中的一个打开,怎么办?会不会是用CFindFile再遍历这几个播放器的exe,若找到就用其打开?

解决方案 »

  1.   

    1. CFile::GetStatus函数调用失败?
    2. 
    TCHAR strSystemDir[MAX_PATH] = {0};
    ::GetSystemDirectory(strSystemDir, MAX_PATH);
    CString strPicFile=_T("E:\\11.bmp");
    CString strRundll(_T(""));
    strRundll.Format(_T("%s\\rundll32.exe"), strSystemDir);
    CString strParm(_T(""));
    strParm.Format(_T("%s\\shimgvw.dll,ImageView_Fullscreen %s"), strSystemDir, strPicFile);
    ShellExecute(NULL, _T("Open"), strRundll, strParm, NULL, SW_SHOW); 
    3. 可以就用默认关联的播放器打开即可。
    ShellExecute(NULL, _T("Open"), _T("E:\\11.rmvb"), NULL, NULL, SW_SHOW); 
      

  2.   

    问题已经解决。
    不过又有一个新问题:
         我是用的多线程,每遍历到一个文件夹又开个线程。CFileFind的FindFile第一次传递的参数是通过编辑框获取的,若遇到文件夹传的就是当前目录。
         UINT __cdecl CEnumFileDlg::MyProc( LPVOID pParam )
    {
    CEnumFileDlg *pThis=(CEnumFileDlg *)pParam;

    pThis-> SearchFile(pThis->m_Path);
            return 1;
    }
    void CEnumFileDlg::OnBnClickedButton2()
    {

           GetDlgItemText(IDC_EDIT1,m_Path);
    AfxBeginThread(MyProc,this);
    mp3=m_ListCtrl.GetItemCount();
    nCount.AppendFormat(_T("mp3:%d 个\r\n"),mp3); }      BOOL CEnumFileDlg::SearchFile(LPCTSTR lpszPath)
    {
    CString m_FilePath(lpszPath);
    if(m_FilePath.Right(1)!='\\')
    m_FilePath+=_T("\\");
    CFileFind m_Find;
    BOOL bRet=m_Find.FindFile(m_FilePath+_T("*.*"),0);
    while(bRet)
    {
    bRet=m_Find.FindNextFile();
    if(m_Find.IsDots())
    continue;
    else
    {
    if(m_Find.IsDirectory())
    {
    //uFlag=1;
    //SearchFile(m_Find.GetFilePath());

    m_Path=m_Find.GetFilePath();
    AfxBeginThread(MyProc,this);
    }
    else
    {
    if(m_Find.GetFilePath().Right(4)==m_Type)
    {
    CString mm=m_Find.GetFilePath();
    CFile file(mm,CFile::modeReadWrite);
    CFileStatus m_FileStatus;
    file.GetStatus(m_FileStatus);
    CString m_cTime,m_mTime,m_Byte;
    m_cTime=m_FileStatus.m_atime.Format(_T("%y-%m-%d %H:%M:%S"));
    m_mTime=m_FileStatus.m_atime.Format(_T("%y-%m-%d %H:%M:%S"));
    m_Byte.Format(_T("%d KB"),m_FileStatus.m_size/1024);
    int index=m_ListCtrl.InsertItem(m_ListCtrl.GetItemCount(),_T(""));
    m_ListCtrl.SetItemText(index,0,m_Find.GetFileName());
    m_ListCtrl.SetItemText(index,1,m_Byte);
    m_ListCtrl.SetItemText(index,2,m_cTime);
    m_ListCtrl.SetItemText(index,3,m_cTime);
    m_ListCtrl.SetItemText(index,4,m_Find.GetFilePath());
    }
    }
    }
    }
    return TRUE;
    }
    注:m_Path是全局变量,第一次是编辑框内容,第二次是遇到文件夹时的文件夹路径。因为线程函数有返回值,导致后面的代码不能运行,可是我想统计遍历到的文件个数。