本文完整記錄一款「檔案切割機」的開發過程:利用 VCL 檔案控制項(DriveComboBox, DirectoryListBox, FileListBox)選取檔案,指定分割塊大小(KB),自動計算分割數、顯示預覽清單、執行二進位切割、產生進度顯示,並自動生成 DOS copy /b 批次檔供使用者無需本程式即可合併還原。
ComboBox 輸入分割大小 (KB),Edit 顯示來源路徑、目標前綴、預估分割數。ListBox 列出將產生的分割檔名(如 file.1, file.2...)。ProgressBar 顯示切割進度。FileHandle, FileLength, num, buf(塊大小), buf1(位元組數), pszBuffer(緩衝區)。void __fastcall TForm1::BitBtn1Click(TObject *Sender) {
if (FileLength <= buf1) { ShowMessage("檔案小於分割單位,無需切割"); return; }
ProgressBar1->Max = num; ProgressBar1->Position = 1;
for (int i = 1; i <= num; i++) {
int chunkSize = (i == num) ? (FileLength - buf1*(num-1)) : buf1;
pszBuffer = new char[chunkSize];
FileHandle = FileOpen(Edit1->Text, fmOpenRead);
FileSeek(FileHandle, buf1*(i-1), 0);
FileRead(FileHandle, pszBuffer, chunkSize);
FileClose(FileHandle);
int h = FileCreate(ChangeFileExt(Edit3->Text, "." + IntToStr(i)));
FileWrite(h, pszBuffer, chunkSize);
FileClose(h);
delete[] pszBuffer;
ProgressBar1->Position = i;
Label5->Caption = "已進行:" + IntToStr(i*100/num) + "%";
}
// 生成合併批次檔
AnsiString cmd = "copy /b";
for (int i = num; i >= 1; i--) {
AnsiString part = ChangeFileExt(Edit3->Text, "." + IntToStr(i));
cmd += (i == 1) ? " " + ExtractFileName(part) : " /b+" + ExtractFileName(part);
}
cmd += " " + ExtractFileName(FileListBox1->FileName);
fstream bat(ChangeFileExt(Edit3->Text, ".bat").c_str(), ios::out);
bat << cmd; bat.close();
}
ComboBox 變更時即時重算分割數與預覽清單。FileListBox 選取檔案時自動填入路徑、預設輸出前綴、計算分割數。ShellAbout API 顯示版本資訊。此工具展示 VCL 快速開發檔案處理應用的典型模式:視覺化元件處理 UI,低層 FileOpen/Read/Write/Seek 處理二進位資料,批次檔生成提供跨環境還原能力。