//分割文件的实现
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();
}
}
MFC文件分割小工具
最新推荐文章于 2022-02-09 17:27:28 发布