程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 用C++ Builder設計實現文件切割機

用C++ Builder設計實現文件切割機

編輯:關於C++

一、程序設計原理

我們知道文件之所以能夠被分割是因為所有文件都是以二進制的形式存儲的,然後再根據文件系統的相應規定來進行讀取處理。我們基於這個原理,把所有類型的文件都以二進制進行讀寫,合並時再以二進制的格式把分割後的文件重新重新組合起來,這樣就實現了對文件的分割與合並。

二、程序設計過程及祥解

1.我們先在c++ builder 中新建一個工程,存盤並命名工程文件為fgj.bpr,命名單元文件為filefgj.h。

2.在該工程中分別加入DriveComboBox、DirectoryListBox、FilterComboBox、FileListBox1(以上幾個控件位於win3.1組件框中)再添加一個ComboBox組合框、添加三個EDIT組件、添加一個ListBox1列表框、添加5個位圖按鈕組件BitBtn、添加一個進度條ProgressBar1、添加三個文字標簽Label。各項設置如下圖

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

打開filefgj.h 頭文件,在 private: // User declarations後面添加如下變量

int FileHandle; // 文件名柄變量
int FileLength; file://源文件大小變量
int num; file://源文件被分割後的文件數目
int iBytesRead; file://
char *pszBuffer;//
int buf; // 文件緩沖區變量
int buf1;//文件緩沖區變量

雙擊FileListBox組件編寫該組件的響應事件如下:

void __fastcall TForm1::FileListBox1Change(TObject *Sender)
{
Edit1->Text=FileListBox1->FileName;
Edit3->Text=FileListBox1->FileName+'0';
buf=((ComboBox1->Text).ToInt());
buf1=buf*1024l;
FileHandle=FileOpen(Edit1->Text, fmOpenRead);
FileLength=FileSeek(FileHandle,0,2);
num=FileLength/buf1+1;
Edit4->Text="分割成"+IntToStr(num)+"個文件";
FileClose(FileHandle);
ListBox1->Items->Clear();
for (int i=1;i<=num;i++)
{
ListBox1->Items->Add(ChangeFileExt(Edit3->Text,"."+IntToStr(i)));
}
}
file://-------------------------------------------------------------

雙擊ComboBox1組件編寫如下響應代碼:(並把OnChange、OnEnter的響應代碼也設為該段代碼)

void __fastcall TForm1::ComboBox1Click(TObject *Sender)
{
buf=(ComboBox1->Text.ToInt());
buf1=buf*1024l;
num=FileLength/(buf*1024L)+1;
Edit4->Text=num;
ListBox1->Items->Clear();
for (int i=0;i {
ListBox1->Items->Add(ChangeFileExt(Edit3->Text,"."+IntToStr(i)));
}
}
file://---------------------------------

雙擊切割按鈕編寫切割按鈕的響應函數如下:

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if (FileLength<=buf1) file://判斷欲分割的文件是否小於要分割的字節大小
{ShowMessage("文件小於要分割的大小,不用分割");
return;}
ProgressBar1->Max=num;//初始化進度條
ProgressBar1->Position=1;
int i=1;
pszBuffer = new char [buf1]; file://設置讀寫文件緩沖區
int temp=buf1;
for (i=1;i<=num;i++)
{
if (i==num) pszBuffer = new char [FileLength-buf1*(num-1)];
if (i==num) temp=FileLength-buf1*(num-1);
FileHandle=FileOpen(Edit1->Text,fmOpenRead); file://打開文件名柄
FileSeek(FileHandle,buf1*(i-1),0);
if (FileRead(FileHandle, pszBuffer,temp)!=temp) ShowMessage("Read error!");
FileClose(FileHandle);
ProgressBar1->Position=i;
Label5->Caption="已進行:"+AnsiString(ProgressBar1->Position*100/num)+"";
int Handle=FileCreate((ChangeFileExt(Edit3->Text,"."+IntToStr(i))));
if (FileWrite(Handle,pszBuffer,temp)!=temp) ShowMessage("Write error!");
FileClose(Handle);
}
ProgressBar1->Position=1;
Label5->Caption="完成分割";
file://------------------------------------ 生成合並文件時的自動批處理文件代碼
AnsiString name="/b";
for (int i=num;i>=1;i--)
{
AnsiString nn=ChangeFileExt(Edit3->Text,"."+IntToStr(i));
if (ExtractFileName(FileListBox1->FileName).Length()>12)
{nn=ExtractShortPathName(FileListBox1->FileName);
nn=ChangeFileExt(nn,"."+IntToStr(i));
}
if (i==1)
{name=ExtractFileName(nn)+name;}
else
{
name="/b+"+ExtractFileName(nn)+name;}
}
AnsiString hbbat="copy "+name+" "+ExtractFileName(FileListBox1->FileName);
fstream file;
file.open(ChangeFileExt(Edit3->Text,".bat").c_str());
file< file.close();
}

雙擊"關於程序"位圖按鈕編寫"關於程序"的響應代碼如下:

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
ShellAbout(Handle,"","\n明臣文件切割機(V1.00) 版權所有(C)馬明臣\n地址:黑龍江省五大連池市統計局 2002.6\n聯系電話:6322348 Email:[email protected]",NULL); file://利用api函數顯示版板信息
}
雙擊"退出程序"位圖按鈕編寫"退出程序"的響應代碼如下:
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
Close();
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved