相比 NMFTP(需 FTP 伺服器、配置複雜),NMStrmServ (接收端) + NMStrm (發送端) 直接基於 TCP 串流,零配置、點對點、適合內網快速檔案交換。
TNMStrmServ (命名 NMStrmServ1) 與 TSaveDialog (SaveDialog1)NMStrmServ1 的 OnMsg 事件:void __fastcall TForm1::NMStrmServ1Msg(TObject *Sender, TMemoryStream* Strm) {
if (!SaveDialog1->Execute()) return; // 使用者取消
if (FileExists(SaveDialog1->FileName))
DeleteFile(SaveDialog1->FileName); // 覆蓋前刪除
std::unique_ptr fs(new TFileStream(SaveDialog1->FileName, fmCreate));
try {
fs->CopyFrom(Strm, Strm->Size); // 核心:串流複製
ShowMessage("接收成功!儲存為 " + SaveDialog1->FileName);
} catch (...) {
ShowMessage("接收失敗!");
}
// unique_ptr 自動釋放 fs
}
TNMStrm (NMStrm1)、TOpenDialog、TButton、TEdit (IP)、TLabelButton1 (Caption="發送檔案") OnClick:void __fastcall TForm1::Button1Click(TObject *Sender) {
if (!OpenDialog1->Execute()) return;
std::unique_ptr fs(new TFileStream(OpenDialog1->FileName, fmOpenRead));
try {
NMStrm1->Host = Edit1->Text; // 目標 IP/主機名
NMStrm1->FromName = "MyApp"; // 發送者識別
NMStrm1->PostIt(fs.get()); // 發送串流
ShowMessage("檔案 " + OpenDialog1->FileName + " 發送成功!");
} catch (...) {
ShowMessage("發送失敗:" + OpenDialog1->FileName);
}
}
| 組件 | 屬性/方法 | 說明 |
|---|---|---|
| TNMStrmServ | OnMsg | 接收到串流觸發,參數為 TMemoryStream* |
| TNMStrm | Host | 接收端 IP 或主機名(預設 127.0.0.1 本機測試) |
| FromName | 發送者名稱,顯示於接收端 | |
| PostIt(TStream*) | 同步發送串流,阻塞直到完成或逾時 | |
| TFileStream | fmCreate/fmOpenRead | 建立新檔 / 唯讀開啟現有檔 |
| CopyFrom(Source, Count) | 高效串流複製,內部使用 64KB 緩衝區 |
Receiver.exe、Sender.exePort 屬性修改)TMemoryStream 全載入記憶體,>100MB 建議改用 TFileStream 直接配合 TIdTCPServer/Client (Indy) 分塊傳輸NMStrmServ/NMStrm 是 C++Builder 內建的輕量級檔案傳輸組合,**適合中小檔案、內網、快速原型**。掌握 TFileStream + CopyFrom 串流複製模式,可無縫遷移至更強大的網路庫。