查找文件
CFileFind类
提取文件图标
显示大图标
显示小图标
一、查找文件
1、CFileFind类
//c:\mydir\myfile.txt
GetFileName | 获取文件名 myfile.txt | ||
GetFilePath | 获取文件路径c:\mydir\myfile.txt | ||
GetFileTitle | 获取文件标题 myfile | ||
Close | 关掉搜索请求,释放掉占用资源 |
| |
FindFile | 搜索目录,成功返回非零值,否则返回0 |
| |
FindNextFile | 继FindFile后查找下一个文件,最后一个文件时返回 |
| |
IsReadOnly | Determines if the found file is read-only. |
IsDirectory | Determines if the found file is a directory. |
IsCompressed | Determines if the found file is compressed. |
IsSystem | Determines if the found file is a system file. |
IsHidden | Determines if the found file is hidden. |
IsTemporary | Determines if the found file is temporary. |
二、提取文件图标
WINSHELLAPI DWORD WINAPI SHGetFileInfo(
LPCTSTR pszPath, //文件路径
DWORD dwFileAttributes, //文件属性 忽略
SHFILEINFO FAR *psfi,//返回文件信息
UINT cbFileInfo, //SHFILEINFO 结构大小
UINT uFlags //文件标志 SHGFI_ICON
);
三、代码测试
CListCtrl* m_list1=(CListCtrl*)GetDlgItem(IDC_LIST1);
int indeximage;
imagelistb.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);//创建图标列表
//imagelistb.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
CFileFind cFindFiles;
WCHAR szFileName[256];
WCHAR found[200];
swprintf(szFileName,L"%s//*.* ",L"C:\\");
BOOL bFound=cFindFiles.FindFile(L"C:\\//*.*");
//
while(bFound)//这个循环是枚举文件的
{
bFound=(BOOL)cFindFiles.FindNextFile();
if(!cFindFiles.IsDirectory())
{
wcscpy(found,cFindFiles.GetFilePath().GetBuffer(200));
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo(found,
0,
&shfi, sizeof(shfi),
SHGFI_ICON ); //获取文件信息,含图标的
indeximage=imagelistb.Add( shfi.hIcon);//向ImageList里面添加图标shfi.hIcon
int nCount=m_list1->GetItemCount();
m_list1->InsertItem(nCount,found,nCount);
}
}
m_list1->SetImageList(&imagelistb,LVSIL_NORMAL); //设置图标
m_list1->SetImageList(&imagelistb,LVSIL_SMALL);
int CDialog_ListCtrl_Test::OnInitDialog(void)
{
//添加项目
CListCtrl* plst_ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
//添加图标
m_imagelist_b.Create(32,32,ILC_COLOR32|ILC_MASK ,0,0);
m_imagelist_s.Create(16,16,ILC_COLOR32|ILC_MASK ,0,0);
plst_ctl->SetImageList(&m_imagelist_b,LVSIL_NORMAL );//大图标
plst_ctl->SetImageList(&m_imagelist_s,LVSIL_SMALL );
/*plst_ctl->InsertItem(0,L"0000",0);
plst_ctl->InsertItem(1,L"1111",0);
plst_ctl->InsertItem(2,L"2222");
plst_ctl->InsertItem(3,L"aaaaa");
plst_ctl->SetItemText(3,0,L"33333");*/
CFileFind findfile;
int nfound=findfile.FindFile(L"C:\\Windows\\//*.*");
int i=0;
while(nfound)
{
nfound=findfile.FindNextFile();
if (findfile.IsDirectory())
{
continue;
}
SHFILEINFO finfo;
//获取文件信息,主要图标icon
SHGetFileInfo(findfile.GetFilePath(),0,&finfo,sizeof(finfo),SHGFI_ICON );
//添加文件项目和图标
m_imagelist_s.Add(finfo.hIcon);//向ImageList里添加图标资源
plst_ctl->InsertItem(i++,findfile.GetFileName(), m_imagelist_b.Add(finfo.hIcon));
}
findfile.Close();//释放资源
return 0;
}
****************************************************************************
获取CListCtrl选中文本
用ShellExecute打开外部文件
一、CListCtrl::GetFirstSelectedItemPosition
CListCtrl::GetFirstSelectedItemPosition
POSITION GetFirstSelectedItemPosition( ) const;
//返回选中项目的位置
二、CListCtrl::GetNextSelectedItem
CListCtrl::GetNextSelectedItem
int GetNextSelectedItem( POSITION& pos ) const;
//返回选中项目的索引值
三、ShellExecute函数
HINSTANCE ShellExecute(
HWND hwnd, //指定父窗口句柄,此参数可为NULL
LPCTSTR lpOperation, //操作方式
LPCTSTR lpFile, //要打开的文件名,一般是全路径的如 c:\\1.txt
LPCTSTR lpParameters, //要带的参数
LPCTSTR lpDirectory,//默认运行目录
INT nShowCmd //显示方式
);
四、代码示例
void CDialog_ListCtrl_Test::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
CListCtrl* plst_ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
POSITION pos=plst_ctl->GetFirstSelectedItemPosition();
if (pos)
{
int item=plst_ctl->GetNextSelectedItem(pos);
CString ws=plst_ctl->GetItemText(item,0); //获取文件名
TRACE("%ws \n",ws);
CString filepath;
filepath=L"C:\\Windows\\";
ws=filepath+ws; //算出文件路径
ShellExecute(0,L"open",ws,NULL,NULL,SW_SHOW); //打开文件
}
*pResult = 0;
}
//
void CDialog_ListCtrl_Test::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//获取文件目录路径及文件
CListCtrl* plst_ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
//获取ListCtrl选中项的位置
POSITION pos=plst_ctl->GetFirstSelectedItemPosition();
if (pos)
{
int item_index=plst_ctl->GetNextSelectedItem(pos);
//获取选中图标的文件名
CString filename=plst_ctl->GetItemText(item_index,0);
filename=FileDir+filename;
TRACE("%ws \n",filename);
ShellExecuteW(0,NULL,filename,NULL,NULL,SW_SHOWNORMAL);
}
*pResult = 0;
}