MFC文件分割小工具

版权声明:本文为博主原创文章,转载请附上原文链接。 https://blog.csdn.net/Jayszxs/article/details/50829922
//分割文件的实现
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();
	}
}

猜你喜欢

转载自blog.csdn.net/Jayszxs/article/details/50829922