情况是这样:
用CFileFind遍历文件后,然后用CFileStatus得到文件属性,如遍历到正在使用的文件,就出错了,然后不往下面走。我猜CFileFind是可以遍历到正在使用的文件,只是CFile::GetStatus不能得到正在使用的文件的属性,但我又想得到属性,怎么处理?
另一个问题,想用“Windows 图片和传真查看器”打开文件个,结果“Windows 图片和传真查看器”不是个exe程序,是用dll插入到Explorer.exe中的,想打开这个文件怎么处理?
还有一个问题,比如找到一个rmvb文件,用相应播放器打开,可我又装了“暴风影音”“百度影音”“QQ影音”,怎么选择?还有就是我不知道别人电脑上安装了什么播放器,但我想用其中的一个打开,怎么办?会不会是用CFindFile再遍历这几个播放器的exe,若找到就用其打开?
用CFileFind遍历文件后,然后用CFileStatus得到文件属性,如遍历到正在使用的文件,就出错了,然后不往下面走。我猜CFileFind是可以遍历到正在使用的文件,只是CFile::GetStatus不能得到正在使用的文件的属性,但我又想得到属性,怎么处理?
另一个问题,想用“Windows 图片和传真查看器”打开文件个,结果“Windows 图片和传真查看器”不是个exe程序,是用dll插入到Explorer.exe中的,想打开这个文件怎么处理?
还有一个问题,比如找到一个rmvb文件,用相应播放器打开,可我又装了“暴风影音”“百度影音”“QQ影音”,怎么选择?还有就是我不知道别人电脑上安装了什么播放器,但我想用其中的一个打开,怎么办?会不会是用CFindFile再遍历这几个播放器的exe,若找到就用其打开?
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);
不过又有一个新问题:
我是用的多线程,每遍历到一个文件夹又开个线程。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是全局变量,第一次是编辑框内容,第二次是遇到文件夹时的文件夹路径。因为线程函数有返回值,导致后面的代码不能运行,可是我想统计遍历到的文件个数。