-
c语言入门之BCB里使用流Stream分割文件
作者: 小兵 (wyb45@sohu.com)
现在很多分割文件程序的源代码是用VC写的,同样将VC的代码转换成BCB也不是难事,但是BCB里封装了很多类,操作起来更方便和容易。
这是我使用BCB使用TMemoryStream和TFileStream来做的分割文件程序。关键代码也就十几句。
首先放一个OpenDialog和Button,Edit,在Button的单击事件里写入如下代码。
int aim_size=0;
try
{
int Edit1_size=Edit1->Text.ToInt();
aim_size=Edit1_size;
}
catch(...)
{return;}
int k_1024=1024*aim_size;
if (!OpenDialog1->Execute())
return;
String file_name=OpenDialog1->FileName;
if(file_name=="")
Button2Click(Sender);
if(!FileExists(file_name)) file://文件有效
{ShowMessage("无效文件");
return;}
String file_path=ExtractFilePath(file_name);//文件路径
// String file_ext =ExtractFileExt(file_name); file://文件后缀
String file_Na =ExtractFileName(file_name); file://文件名
try
{
TMemoryStream* pms = new TMemoryStream();//原文件
pms->LoadFromFile(file_name);
pms->Seek(0, soFromBeginning);//定位头部
int sizemem=(pms->Size)/k_1024;//n K
if(sizemem>999)
{
ShowMessage("文件超过预定数量,无法分割\n请将分割后文件扩大");
return;
}
String batfile="@echo off \r\ncopy /b "; file://生成bat批处理文件的内容
String n_i="";
for(int i=0;i<sizemem;i++)
{
n_i=(String)i;
n_i="00"+n_i;
n_i=n_i.SubString(n_i.Length()-2,3);
batfile=batfile+file_Na+"."+n_i+"+ ";
TMemoryStream* pms_i = new TMemoryStream();//目标文件
pms_i->CopyFrom(pms,k_1024);
pms_i->SaveToFile(file_Na+"."+n_i);
delete pms_i;
}
n_i=(String)sizemem;
n_i="00"+n_i;
n_i=n_i.SubString(n_i.Length()-2,3);
TMemoryStream* pms_i = new TMemoryStream();//最后一个文件
pms_i->CopyFrom(pms,pms->Size-sizemem*k_1024);
pms_i->SaveToFile(file_path+file_Na+"."+n_i);
batfile=batfile+file_Na+"."+n_i;
batfile=batfile+" "+file_Na;
delete pms_i;
delete pms;
try
{
TFileStream *Mybat;
Mybat = new TFileStream(file_path+file_Na+".bat", fmCreate);
char *bat=batfile.c_str();
Mybat->WriteBuffer(bat,batfile.Length());
delete Mybat;
}
catch(...)
{}
ShowMessage("文件分割成功");
}
catch(...)
{ShowMessage("文件分割出现错误");
}
file://代码中还生成了一个.bat文件用于合并,很简单吧。
使用流合并文件也很简单,有兴趣的话联系我,我也刚接触流类。
现在很多分割文件程序的源代码是用VC写的,同样将VC的代码转换成BCB也不是难事,但是BCB里封装了很多类,操作起来更方便和容易。
这是我使用BCB使用TMemoryStream和TFileStream来做的分割文件程序。关键代码也就十几句。
首先放一个OpenDialog和Button,Edit,在Button的单击事件里写入如下代码。
int aim_size=0;
try
{
int Edit1_size=Edit1->Text.ToInt();
aim_size=Edit1_size;
}
catch(...)
{return;}
int k_1024=1024*aim_size;
if (!OpenDialog1->Execute())
return;
String file_name=OpenDialog1->FileName;
if(file_name=="")
Button2Click(Sender);
if(!FileExists(file_name)) file://文件有效
{ShowMessage("无效文件");
return;}
String file_path=ExtractFilePath(file_name);//文件路径
// String file_ext =ExtractFileExt(file_name); file://文件后缀
String file_Na =ExtractFileName(file_name); file://文件名
try
{
TMemoryStream* pms = new TMemoryStream();//原文件
pms->LoadFromFile(file_name);
pms->Seek(0, soFromBeginning);//定位头部
int sizemem=(pms->Size)/k_1024;//n K
if(sizemem>999)
{
ShowMessage("文件超过预定数量,无法分割\n请将分割后文件扩大");
return;
}
String batfile="@echo off \r\ncopy /b "; file://生成bat批处理文件的内容
String n_i="";
for(int i=0;i<sizemem;i++)
{
n_i=(String)i;
n_i="00"+n_i;
n_i=n_i.SubString(n_i.Length()-2,3);
batfile=batfile+file_Na+"."+n_i+"+ ";
TMemoryStream* pms_i = new TMemoryStream();//目标文件
pms_i->CopyFrom(pms,k_1024);
pms_i->SaveToFile(file_Na+"."+n_i);
delete pms_i;
}
n_i=(String)sizemem;
n_i="00"+n_i;
n_i=n_i.SubString(n_i.Length()-2,3);
TMemoryStream* pms_i = new TMemoryStream();//最后一个文件
pms_i->CopyFrom(pms,pms->Size-sizemem*k_1024);
pms_i->SaveToFile(file_path+file_Na+"."+n_i);
batfile=batfile+file_Na+"."+n_i;
batfile=batfile+" "+file_Na;
delete pms_i;
delete pms;
try
{
TFileStream *Mybat;
Mybat = new TFileStream(file_path+file_Na+".bat", fmCreate);
char *bat=batfile.c_str();
Mybat->WriteBuffer(bat,batfile.Length());
delete Mybat;
}
catch(...)
{}
ShowMessage("文件分割成功");
}
catch(...)
{ShowMessage("文件分割出现错误");
}
file://代码中还生成了一个.bat文件用于合并,很简单吧。
使用流合并文件也很简单,有兴趣的话联系我,我也刚接触流类。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式