软件作者:灰狐 (
peiyaoqiang@yahoo.com.cn)
原始出处:灰狐's Blog (
Www.HuiHu32.cN)
经过两天的编码和一天的调试与修改问题,此简陋的软件终于艰难地出生了。
不知道该怎么发图,所以就不发图了,呵呵。
当您打开这个软件的时候,您一定会惊讶地发现似曾相识,呵呵,不错,由于对界面设计没有什么经验,所以在界面上面我完全参考了 sudami 同学的 文件切割器 的界面。
详细参见本版:
http://forum.eviloctal.com/read-htm-tid-29938.html
在这里向 sudami 同学表示感谢。
本程序完全使用Borland C++ Builder 6.0进行开发,分割合并的代码均采用标准C。
以下为我去除了一部分(只是部分喔) BCB 特有的东西后的核心代码,全部代码见附件。
复制内容到剪贴板
代码:
if(Edit1->Text.Length()==0)
{
MessageBox(NULL,"错误:您没有选择源文件!","警告",NULL);
return;
}
if(RadioButton1->Checked==true) //按体积分割文件
{
StatusBar1->SimpleText="正在切割文件,请稍等...";
FILE *fp,*temp;
fp=fopen(Edit1->Text.c_str(),"rb");
fseek(fp,0,2);
float filesize=ftell(fp); //文件大小,单位:字节
fclose(fp);
char filename[MAX_PATH]; //文件名
int BufferSize=(StrToInt(Edit3->Text))*1024*1024; //要分割后的单一文件最大体积 单位:字节
int Temp=BufferSize;
char* buffer=new char[BufferSize]; //文件读写缓冲区
int j=1;
int num=StrToInt(FileNumberLabel->Caption); //要分割出的文件个数
for(j=1;j<=num;j++)
{
if(j==num)
{
buffer=new char[filesize-BufferSize*(num-1)];
Temp=filesize-BufferSize*(num-1);
}
Application->ProcessMessages(); //使之在循环时同样能接收到消息
sprintf(filename,"%s%d_%s",Edit2->Text.c_str(),j,ExtractFileName(Edit1->Text));
temp=fopen(filename,"wb");
fp=fopen(Edit1->Text.c_str(),"rb");
fseek(fp,BufferSize*(j-1),0);
fread(buffer,1,Temp,fp);
fwrite(buffer,1,Temp,temp);
fclose(fp);
fclose(temp);
}
StatusBar1->SimpleText="Division Completed!";
ShowMessage("文件切割完成!");
return;
}
else if(RadioButton2->Checked==true) //按数量分割文件
{
StatusBar1->SimpleText="File is been Divising...";
ShowMessage("此功能尚未完善,请见谅!");
}
else
{ //合并文件
FILE *fp,*temp;
AnsiString FileName=ExtractFileName(Edit1->Text); //得到文件名
char* filename1=new char[MAX_PATH];
char filename[MAX_PATH],filename2[MAX_PATH],tempname[MAX_PATH];
int i=1,j=2;
filename1=FileName.c_str(); //转换成char*格式
sprintf(filename2,"%s",filename1); //再转换成字符数组格式
if(filename2[0]<=48 || filename2[0]>=58 ) //判断文件名是否以数字开头(即判断是否为分割后的文件)
{
MessageBox(NULL,"您的文件不合法,请重新选择!","警告",NULL);
return;
}
//将文件名中纯文件名提取出来,即去掉前面的数字和下划线
sscanf(filename2,"%d_%s",&i,&tempname);
//判断有多少个符合格式的文件
bool flag=true;
while(flag)
{
sprintf(filename,"%d_%s",i,tempname);
fp=fopen(filename,"rb");
if(fp==NULL)
{
i=i-1;
flag=false;
break;
}
fclose(fp);
i=i+1;
}
ShowMessage("找到符合条件的文件共有"+AnsiString(i)+"个");
//下面开始合并文件
sprintf(filename,"1_%s",tempname);
fp=fopen(filename,"ab");
for(int num=1;num<=i,j<=i;num++)
{
sprintf(filename2,"%d_%s",j,tempname);
temp=fopen(filename2,"rb");
fseek(temp,0L,2);
int FileLen = ftell( temp );
fseek(temp, 0L, 0);
char *FileBuf = (char *) malloc( FileLen ); //分配适量的存储缓冲区
fread( FileBuf, 1, FileLen, temp );
fwrite( FileBuf, 1, FileLen, fp );
free( FileBuf );
j=j+1;
fclose(temp);
DeleteFile(filename2);
}
fclose(fp);
ShowMessage("合并完成!");
return;
}程序还有一些问题没有解决,如果您遇到问题可以到
http://www.huihu32.cn/post/34.html 留言,以便在下一版中进行改善。
其他就不多说了,需要注意的是如果自己选择保存目录的话需要以“\”结尾,还有就是不要随意更改切割后的文件名,合并后总会有一个文件没有被删除,需要自己手动删除,合并后以数字1_开头的那个文件就是您需要的文件。
程序的代码是BCB的,估计学的人不多,大家凑合着看吧,呵呵。