MFC文件分割小工具
2016-03-08 19:44
405 查看
//分割文件的实现 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(); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- flex 控件的重要属性
- Delphi控件ListView的属性及使用方法详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- web下载的ActiveX控件自动更新
- WinForm实现按名称递归查找控件的方法
- C#中父窗口和子窗口之间控件互操作实例
- C++联合体转换成C#结构的实现方法
- Android编程之Button控件用法实例分析
- Android控件之CheckBox、RadioButton用法实例分析
- 在Android开发中使用自定义组合控件的例子
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析