发新话题
打印

[原创]成信文件切割机 V1.0发布(附源码)

[原创]成信文件切割机 V1.0发布(附源码)

软件作者:灰狐 (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的,估计学的人不多,大家凑合着看吧,呵呵。

附件

FileCutter.rar (325 KB)

2007-8-16 14:42, 下载次数: 37

成信文件切割机 V1.0

Welcome to My Blog :  http://www.huihu32.cn 金麟岂是池中物,一遇风云便化龙!

TOP

LZ做的比我漂亮多了,而且还加了个"菜单栏"和"按数量分割",不错,值得大家学习啊.

指出一个界面上的小BUG,:窗口在最大化的时候没有同步哦,稍微改下代码就可以了.

TOP

不是吧,我这个程序是不能最大化的啊,工具栏也没有嘛,只有个菜单和状态栏,刚好“按数量分割”这个功能我还没加上呢,汗,主要是赶着发出来,等下一版就加上,思路已经有了,然后在根据反馈情况进一步改善
Welcome to My Blog :  http://www.huihu32.cn 金麟岂是池中物,一遇风云便化龙!

TOP

引用:
如果自己选择保存目录的话需要以“\”结尾
这个只要加句 If 判断下

如果是以字符"\"结尾,跳过
不是则补上
--->  伱 能 領 導 潮 流.  我 可 領 導 全 賕!  <---

TOP

发新话题