利用C++ Builder設計實現文件切割機 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
利用C Builder設計實現文件切割機Keywords: 文件切割 Author: yesky 馬明臣 資料來源: http://www.ccrun.com/ 一、程序設計原理 我們知道文件之所以能夠被分割是因為所有文件都是以二進制的形式存儲的,然後再根據文件系統的相應規定來進行讀取處理。我們基於這個原理,把所有類型的文件都以二進制進行讀寫,合併時再以二進制的格式把分割後的文件重新重新組合起來,這樣就實現了對文件的分割與合併。 二、程序設計過程及祥解 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:MMC@0451.com",NULL); file://利用api函數顯示版板信息 } 雙擊"退出程序"位圖按鈕編寫"退出程序"的響應代碼如下: void __fastcall TForm1::BitBtn3Click(TObject *Sender) { Close(); }網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |