您的位置:首页 > 编程语言 > C语言/C++

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc 控件 C++