C#如何实现文件传送
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章给大家分享的是有关C#如何实现文件传送的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#文件传送使用较为频繁的场景,是即时聊天工具中的文件传输。比如点对点方面的传送
千家信息网最后更新 2026年11月04日C#如何实现文件传送
这篇文章给大家分享的是有关C#如何实现文件传送的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
C#文件传送使用较为频繁的场景,是即时聊天工具中的文件传输。比如点对点方面的传送。在一般情况下,C#文件传送都要对通信端口,连接的控制,异常的控制等做好准备。
这个C#文件传送程序是借鉴TcpFileTransferDemo项目的来的。C#文件传送源码很少,还有改进的地方就是可以用多线程进行大文件传送。
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; namespace CSharpData { /// /// SaveFileForm 的摘要说明。 /// public class SaveFileForm : System.Windows.Forms.Form { private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button4; private System.Windows.Forms.Button button3; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button1; private System.Windows.Forms.StatusBar statusBar1; /// /// 必需的设计器变量。 /// private System.ComponentModel.Container components = null; public SaveFileForm() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); setStatusDelegate = new SetStatusDelegate(SetStatus); getSaveFileDelegate = new GetSaveFileDelegate(GetSaveFile); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// /// 清理所有正在使用的资源。 /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows 窗体设计器生成的代码 /// /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.panel1 = new System.Windows.Forms.Panel(); this.textBox2 = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.button4 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.statusBar1 = new System.Windows.Forms.StatusBar(); this.panel1.SuspendLayout(); this.SuspendLayout(); // // panel1 // this.panel1.Controls.Add(this.textBox2); this.panel1.Controls.Add(this.label2); this.panel1.Controls.Add(this.textBox1); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.button4); this.panel1.Controls.Add(this.button3); this.panel1.Controls.Add(this.button2); this.panel1.Controls.Add(this.button1); this.panel1.Location = new System.Drawing.Point(8, 16); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(272, 152); this.panel1.TabIndex = 0; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(96, 64); this.textBox2.Name = "textBox2"; this.textBox2.TabIndex = 15; this.textBox2.Text = "800"; // // label2 // this.label2.Location = new System.Drawing.Point(8, 72); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(80, 16); this.label2.TabIndex = 14; this.label2.Text = "通信端口"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(96, 24); this.textBox1.Name = "textBox1"; this.textBox1.TabIndex = 13; this.textBox1.Text = "192.168.1.250"; // // label1 // this.label1.Location = new System.Drawing.Point(8, 32); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(80, 16); this.label1.TabIndex = 12; this.label1.Text = "IP地址"; // // button4 // this.button4.Location = new System.Drawing.Point(160, 104); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(64, 23); this.button4.TabIndex = 11; this.button4.Text = "接收文件"; this.button4.Click += new System.EventHandler(this.button4_Click); // // button3 // this.button3.Location = new System.Drawing.Point(56, 104); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(64, 23); this.button3.TabIndex = 10; this.button3.Text = "发送文件"; this.button3.Click += new System.EventHandler(this.button3_Click); // // button2 // this.button2.Location = new System.Drawing.Point(200, 64); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(64, 23); this.button2.TabIndex = 9; this.button2.Text = "停止监听"; this.button2.Click += new System.EventHandler(this.button2_Click); // // button1 // this.button1.Location = new System.Drawing.Point(200, 24); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(64, 23); this.button1.TabIndex = 8; this.button1.Text = "开始监听"; this.button1.Click += new System.EventHandler(this.button1_Click); // // statusBar1 // this.statusBar1.Location = new System.Drawing.Point(0, 191); this.statusBar1.Name = "statusBar1"; this.statusBar1.Size = new System.Drawing.Size(292, 22); this.statusBar1.TabIndex = 1; this.statusBar1.Text = "statusBar1"; // // SaveFileForm // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(292, 213); this.Controls.Add(this.statusBar1); this.Controls.Add(this.panel1); this.Name = "SaveFileForm"; this.Text = "局域网内接收文件"; this.panel1.ResumeLayout(false); this.ResumeLayout(false); } #endregion private void button1_Click(object sender, System.EventArgs e) { port = 0; try { port = int.Parse(textBox2.Text); if (port < 1 || port > 65535) throw new ArgumentOutOfRangeException(); } catch { MessageBox.Show("请输入有效的端口号。"); textBox2.Focus(); textBox2.SelectAll(); return; } button1.Enabled = false; button2.Enabled = true; worker = new Thread(new ThreadStart(Start)); worker.IsBackground = true; worker.Start(); } private void button2_Click(object sender, System.EventArgs e) { try { worker.Abort(); } catch {} } private void button3_Click(object sender, System.EventArgs e) { } private void button4_Click(object sender, System.EventArgs e) { } #region 程序逻辑 private Thread worker; private int port; private void Start() { try // 捕获线程中止异常 { SetStatus("开始侦听端口"); TcpListener tcpListener = new TcpListener(IPAddress.Any, port); try // 捕获开始侦听时出现的错误,例如端口已被占用 { tcpListener.Start(); } catch (Exception e) { SetStatus("侦听端口出错:" + e.Message); InvokeCancel(); return; } try // 确保停止侦听 { SetStatus("等待传入连接中"); while (true) // 一直循环,直到线程被中止。但每次只处理一个连接 { // 没有等待传入的连接就一直等待。不使用异步模型以提高程序可读性 while (!tcpListener.Pending()) Thread.Sleep(100); TcpClient tcpClient = tcpListener.AcceptTcpClient(); tcpClient.NoDelay = true; tcpClient.ReceiveTimeout = 30000; BinaryReader reader = new BinaryReader(tcpClient.GetStream()); try // 捕获文件传输中途出现的错误,并确保关闭连接 { string filename = reader.ReadString(); long total = reader.ReadInt64(); SetStatus("收到文件传输请求,文件名 " + filename + ",大小 " + total.ToString() + " 字节"); string saveAs = GetSaveFile(filename); if (saveAs == null) { SetStatus("操作已取消。等待下一连接中"); // finally 段会帮忙关闭连接 } else { SetStatus("接收文件中"); FileStream fs = File.Create(saveAs); try { byte[] buffer = new byte[8192]; int len; while (total > 0) { len = reader.Read(buffer, 0, 8192); if (len == 0) throw new IOException("发送方中止了连接"); fs.Write(buffer, 0, len); SetStatus("接收文件中 - 剩余 " + (total -= len).ToString() + " 字节"); } SetStatus("文件已保存至 " + saveAs + "。等待下一连接中"); } finally { fs.Close(); } } } catch (Exception e) { SetStatus("文件传输中途出错:" + e.Message); InvokeCancel(); } finally { try { reader.Close(); } catch {} try { tcpClient.Close(); } catch {} } } } finally { tcpListener.Stop(); } } catch (ThreadAbortException) { SetStatus("用户中断"); InvokeCancel(); } finally { worker = null; } } #endregion #region 线程安全UI操作代码 private delegate void SetStatusDelegate(string status); private SetStatusDelegate setStatusDelegate; // 赋值在构造函数里 private void SetStatus(string status) { if (InvokeRequired) Invoke(setStatusDelegate, new object[] { status }); else statusBar1.Text = status; } private void InvokeCancel() { if (InvokeRequired) Invoke(new MethodInvoker(InvokeCancel)); else { button2.Enabled = false; button1.Enabled = true; } } private delegate string GetSaveFileDelegate(string filename); private GetSaveFileDelegate getSaveFileDelegate; // private string GetSaveFile(string filename) { if (InvokeRequired) return (string)Invoke(getSaveFileDelegate, new object[] { filename }); else { //打开要发送的文件 SaveFileDialog sfd = new SaveFileDialog(); sfd.FileName = filename; if (sfd.ShowDialog(this) == DialogResult.OK) return sfd.FileName; else return null; } } #endregion } }感谢各位的阅读!关于"C#如何实现文件传送"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
文件
C#
端口
代码
线程
传输
设计
内容
程序
函数
字节
更多
窗体
篇文章
错误
控制
支持
监听
通信
不错
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网核心科技是什么
互联网科技有限公司图片
互联网科技上市公司
融势互联网科技
兼蜜互联网科技
苏州大垚互联网科技
撒么互联网科技公司
互联网科技有限公司 翻译
深圳互联网科技怎么样
宁夏众和广鑫互联网科技有限公司
栖莱科技互联网股份有限公司
杭州壁岐互联网科技有限公司
工业互联网山东科技大学
沐思想互联网科技有限公司
北京市互联网新科技
广州富喜互联网络科技
互联网相关科技技术
求路客互联网科技电话
科技和互联网行业的特点
科技发展第三阶段互联网时代
科技互联网
互联网科技名片
互联网与科技发展
苏州互联网科技贷款公司
天下捷融互联网科技
上海亿帐通互联网科技
互联网科技创新服务
普陀区互联网教育科技管理办法
湖北辰鑫科技互联网
科技发展第三阶段互联网时代