把list control中勾选的项放入回收站

void CCleanPrjDlg::OnBnClickedButtonDeleteFiles()
{
	if (m_lcScannedFiles.GetItemCount() == 0)
	{//当前文件夹无文件
		AfxMessageBox(_T("没有符合的文件"));
		return;
	}

	vector<int> vecChecked;				//记录被勾选的项

	//扫描被勾选的项,并把下标保存在vector中
	int nItemCount = m_lcScannedFiles.GetItemCount();
	for (int i = 0; i < nItemCount; ++i)
	{
		if (m_lcScannedFiles.GetCheck(i))
		{
			vecChecked.push_back(i);
			TRACE(_T("%d checked\n"), i);
		}
	}

	if (vecChecked.empty())
	{//没有勾选任何一项
		AfxMessageBox(_T("请选择要删除的文件"));
	}
	else
	{
		if (AfxMessageBox(_T("确认删除文件?"), MB_YESNO) == IDNO)
		{
			return;
		}
		//填充SHFILEOPSTRUCT结构体
		SHFILEOPSTRUCT fop_struct;
		fop_struct.hwnd = m_hWnd;
		fop_struct.wFunc = FO_DELETE;
		if (AfxMessageBox(_T("是否放入回收站?"), MB_YESNO) == IDYES)
		{//放入回收站
			fop_struct.fFlags = FOF_ALLOWUNDO | FOF_FILESONLY | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR;
		}
		else
		{
			fop_struct.fFlags = FOF_FILESONLY | FOF_SILENT | FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR;
		}
		//获得被勾选项的数目
		int nChecked = vecChecked.size();
		for (int i = 0; i < nChecked; ++i)
		{		
			//从磁盘上删除文件
			CString strFilename = m_lcScannedFiles.GetItemText(vecChecked[i], 0);//文件名
			CString strFilePath = m_lcScannedFiles.GetItemText(vecChecked[i], 1);//文件所在目录
			strFilePath += _T("\\") + strFilename;
			//这里必须是FULL PATH,DOUBLE NULL TERMINATED!
			strFilePath.AppendChar(_T('\0'));
			
			fop_struct.pFrom = strFilePath;

			VERIFY(0 == SHFileOperation(&fop_struct));

			//删除一项以后,所有项的索引值都会-1
			for (int j = i + 1; j < nChecked; ++j)
			{
				--vecChecked[j];
			}

			//删除当前list control中对应索引的项:注意,这里一定要放到实际从磁盘删除之后!!
			m_lcScannedFiles.DeleteItem(vecChecked[i]);
		}
	}
}

2012-04-17更新:上面删除勾选的项的时候算法不好,很烂!如果从最后一项开始删除就不会存在上面一系列下标的减法操作了,效率更高!

posted @ 2012-03-26 18:29  kcy-666  阅读(292)  评论(0编辑  收藏  举报