MFC文件分割小工具

1 篇文章 0 订阅
//分割文件的实现
void CFastFileComminuteToolDlg::OnBnClickedButtonsplite()
{
	// TODO:  在此添加控件通知处理程序代码

	CFile m_SourceFile, destFile;
	int len;

	if (!m_strfile.IsEmpty())	//判断文件框是否为空
	{
		//打开文件
		if (!m_SourceFile.Open(m_strfile, CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary))
		{	
			//打开失败
			return;
		}
		len = m_SourceFile.GetLength();		//获取文件的长度
	}
	else
	{
		AfxMessageBox("请选择要分割的文件!");
		return;
	}

	if (m_strpath.IsEmpty())		//判断存放目录是否为空
	{
		AfxMessageBox("请选择存放目录!");
		return;
	}

	//开始分割
	//采用动态决定分割文件的大小
	int index;
	CString strtep;

	index = m_comSize.GetCurSel();	//index是得到列表中的基于零的数

	m_comSize.GetLBText(index, strtep);	//判断并讲其值传给了strtep

	DWORD dwRead;
	int nCount = _ttoi(strtep) * 1000000;		//分割后文件的大小1MB

	BYTE *buffer = nullptr;		//字节存储空间,用来存储分割的文件
	buffer = new BYTE[nCount];

	int i = 1;
	CString name;


	if (len <= nCount)
	{
		AfxMessageBox("文件大小小于1MB,不需要分割!");
		return;
	}

	int tempLen = m_SourceFile.GetFileName().GetLength();	//获取源文件文件名的长度
	
	CString newName;
	newName = m_SourceFile.GetFileName().Left(tempLen - 4);	//取出除后缀名的源文件的文件名

	CString ch = m_SourceFile.GetFileName().Right(4);	//取出源文件文件名的后缀名

	do 
	{
		dwRead = m_SourceFile.Read(buffer, nCount);
		if (dwRead != 0)
		{
			//建立动态的新文件名 如 XXX_1
			name.Format("_%d%s", i,ch);

			CString newpath;
			//判断选择目录末尾是否已有'\'字符
			if (m_strpath.Right(1) == '\\')
			{
				newpath = m_strpath;
			}
			else
			{
				//链接加 '\' 后的路径
				newpath = m_strpath + _T("\\");
			}

			/*
			CFile::modeWrite 向打开的目录里写数据
			CFile::shareExclusive 共享执行
			CFile::typeBinary 二进制形式读写
			CFile::modeCreate 创建形式
			*/
			if (!destFile.Open(newpath + newName + name,
				CFile::modeWrite | CFile::shareExclusive | CFile::typeBinary | CFile::modeCreate))	//创建分割文件
			{
				m_SourceFile.Close();
				return;
			}
			destFile.Write(buffer, dwRead);		//写入源文件到分割文件
			destFile.Close();	//关闭分割文件
			i++;	//下一个
		}
	} while (dwRead > 0);

	delete[] buffer;
	
	CString str;
	str.Format("分割完成,共分割为%d个文件!", i - 1);
	AfxMessageBox(str);

	m_SourceFile.Close();
	
}


//退出工具
void CFastFileComminuteToolDlg::OnBnClickedButtonexit()
{
	// TODO:  在此添加控件通知处理程序代码

	this->EndDialog(TRUE);
}


//选择文件
void CFastFileComminuteToolDlg::OnBnClickedButtonfile()
{
	// TODO:  在此添加控件通知处理程序代码

	CString strFiletr;		//字符串,存放过滤文件

	strFiletr = "所有文件(*.*)|*.*||";		//打开文件对话框的文件类型,所有文件

	/*
	参数一:TRUE 为“打开”对话框,FALSE为“保存”对话框
	参数二:NULL 默认的文件扩展名
	参数三:NULL 文件对话框中的初始文件名
	参数四:设定对话框的功能
			OFN_EXPLORER 对话框的浏览风格 explorer风格
			OFN_HIDEREADONLY 隐藏只读选项
			OFN_ENABLESIZING 可以使用鼠标或者键盘调整对话框的大小
			OFN_FILEMUSTEXIST 只能输入已经存在的文件名
			strFiletr 文件过滤器 “所有文件(*.*)|*.*||”
	*/
	CFileDialog dlg(TRUE, NULL, NULL, OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_FILEMUSTEXIST, strFiletr);

	if (dlg.DoModal() == IDOK)
	{
		m_strfile = dlg.GetPathName();		//用户选择的分割文件赋值给编辑框的成员变量
		UpdateData(FALSE);		//把控件的成员变量的值显示到控件上
	}
}


//选择的保存目录
void CFastFileComminuteToolDlg::OnBnClickedButtonpath()
{
	// TODO:  在此添加控件通知处理程序代码

	LPMALLOC pMalloc;	//定义指向IMalloc的指针
	if (::SHGetMalloc(&pMalloc) != NOERROR)	//获取SHELL的IMalloc接口的地址
	{
		return;		//获取空间失败
	}

	char szDisplayName[_MAX_PATH];
	char szBuffer[_MAX_PATH];

	//BROWSEINFO结构体,里面包含了用户选中目录的重要信息
	BROWSEINFO browseinfo;								//构造对话框结构
	browseinfo.hwndOwner = this->m_hWnd;				//浏览文件夹对话框的父窗口句柄
	browseinfo.pidlRoot = NULL;							//设置根目录为桌面
	browseinfo.pszDisplayName = szDisplayName;			//保存用户所选中的目录字符串的内存地址
	browseinfo.lpszTitle = "选择分割后的文件目录";		//对话框的标题


	/*
	BIF_RETURNFSANCESTORS 返回文件系统的一个节点,用于分割
	BIF_RETURNONLYFSDIRS 仅仅返回文件系统的目录
	*/
	browseinfo.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
	browseinfo.lpfn = NULL;		//暂时没有用到
	browseinfo.lParam = 0;		//暂时没有用到

	LPITEMIDLIST lpIetmIDList;		//用来保存返回信息的IDList
	if ((lpIetmIDList = ::SHBrowseForFolder(&browseinfo)) != NULL)
	{
		//得到一个目录的路径
		if (::SHGetPathFromIDList(lpIetmIDList,szBuffer))	//把项目标识列表转换成字符串
		{
			if (szBuffer[0] == '\0')
			{
				return;
			}
			m_strpath = szBuffer;
			UpdateData(FALSE);
		}
		else
		{
			AfxMessageBox("不能得到所选择的文件夹", MB_ICONSTOP | MB_OK);
			return;
		}

		pMalloc->Free(lpIetmIDList);
		pMalloc->Release();
	}
}

CPaintDC dc(this); CWnd * pWnd = dc.GetWindow(); CWnd * item1; item1=this->GetDlgItem(IDC_STATIC1); CRect * rect=new CRect; item1->GetWindowRect(rect); POINT a,b; a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); CDC memDC; CBitmap cBitmap; BITMAP bitmap; cBitmap.LoadBitmap(IDB_BITMAP2); //通过资源标识加载图片 // HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"F:\\MFC\\duilian2\\res\\下联.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //通过文件路径加载图片 // cBitmap.Attach(hbmp); cBitmap.GetBitmap(&bitmap); maxh=bitmap.bmHeight; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x,a.y,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); //////////////////////////////////////////////////////////////////////////// CRgn rgn,temprgn; rgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+5,a.y+h+4); item1=this->GetDlgItem(IDC_STATIC2); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP1); cBitmap.GetBitmap(&bitmap); // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x-1,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+4,a.y+h+4); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////////////// item1=this->GetDlgItem(IDC_STATIC3); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP3); cBitmap.GetBitmap(&bitmap); maxw=bitmap.bmWidth; // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(b.x-2-bitmap.bmWidth,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.DeleteObject(); temprgn.CreateRectRgn(b.x-w,a.y,b.x,a.y+bitmap.bmHeight); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////// pWnd->SetWindowRgn(rgn,true); // pWnd->SetForegroundWindow(); rgn.DeleteObject(); temprgn.DeleteObject(); SetTimer(0,15,NULL); //CDialog::OnPaint();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值