当前位置: 首页 > news >正文

.Net下载共享文件夹中的文件

由于IIS站点权限等问题,总是没找到处理办法,所以改用外挂的winform的方式来下载共享文件(也可以改为使用windows服务的方式)。
前提需要先在资源管理器中登录到共享文件夹,确保系统能访问。

  1. 服务端代码 (.NET后端)
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Web;public class FileDownloadService
{private const int WinFormPort = 11000;public void DownloadFile(string filePath){try{// 1. 连接到WinForm客户端using (TcpClient client = new TcpClient("127.0.0.1", WinFormPort))using (NetworkStream netStream = client.GetStream()){// 2. 发送文件路径byte[] pathData = Encoding.UTF8.GetBytes(filePath);netStream.Write(pathData, 0, pathData.Length);// 3. 设置响应头Response.Clear();Response.ContentType = "application/octet-stream";Response.AddHeader("Content-Disposition", $"attachment; filename={HttpUtility.UrlEncode(Path.GetFileName(filePath))}");// 4. 流式传输到客户端浏览器byte[] buffer = new byte[1024 * 1024]; // 1MB缓冲区int bytesRead;while ((bytesRead = netStream.Read(buffer, 0, buffer.Length)) > 0){Response.OutputStream.Write(buffer, 0, bytesRead);Response.Flush();}}}catch (Exception ex){Response.Write($"下载错误: {ex.Message}");}finally{Response.End();}}
}
  1. WinForm客户端代码
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;public class FileTransferService : IDisposable
{private TcpListener _listener;private const int Port = 11000;private bool _isRunning;public void Start(){_isRunning = true;_listener = new TcpListener(IPAddress.Loopback, Port);_listener.Start(10); // 允许10个等待连接BeginAcceptClient();}private void BeginAcceptClient(){if (_isRunning){_listener.BeginAcceptTcpClient(ClientHandler, null);}}private void ClientHandler(IAsyncResult ar){TcpClient client = null;try{client = _listener.EndAcceptTcpClient(ar);ThreadPool.QueueUserWorkItem(ProcessClient, client);}catch (Exception ex){client?.Dispose();MessageBox.Show($"接受连接错误: {ex.Message}");}finally{BeginAcceptClient(); // 继续监听新连接}}private void ProcessClient(object state){using (TcpClient client = (TcpClient)state){try{client.SendTimeout = 30000; // 30秒发送超时client.ReceiveTimeout = 30000; // 30秒接收超时using (NetworkStream netStream = client.GetStream()){// 1. 接收文件路径byte[] buffer = new byte[1024];int received = netStream.Read(buffer, 0, buffer.Length);string filePath = Encoding.UTF8.GetString(buffer, 0, received);// 2. 检查文件是否存在if (!File.Exists(filePath)){byte[] error = Encoding.UTF8.GetBytes("FILE_NOT_FOUND");netStream.Write(error, 0, error.Length);return;}// 3. 分块读取文件并传输using (FileStream fs = File.OpenRead(filePath)){byte[] fileBuffer = new byte[1024 * 1024]; // 1MB缓冲区int bytesRead;while ((bytesRead = fs.Read(fileBuffer, 0, fileBuffer.Length)) > 0){netStream.Write(fileBuffer, 0, bytesRead);}}}}catch (Exception ex){try{byte[] error = Encoding.UTF8.GetBytes($"ERROR:{ex.Message}");client.GetStream().Write(error, 0, error.Length);}catch { /* 忽略二次错误 */ }}}}public void Stop(){_isRunning = false;_listener?.Stop();}public void Dispose(){Stop();_listener?.Dispose();}
}
  1. WinForm界面
public partial class MainForm : Form
{private FileTransferService _fileService;public MainForm(){InitializeComponent();_fileService = new FileTransferService();_fileService.Start();}protected override void OnFormClosing(FormClosingEventArgs e){_fileService.Dispose();base.OnFormClosing(e);}private void btnStart_Click(object sender, EventArgs e){_fileService.Start();lblStatus.Text = "服务已启动 (端口:11000)";}private void btnStop_Click(object sender, EventArgs e){_fileService.Stop();lblStatus.Text = "服务已停止";}
}

Windows查看端口是否被占用

netstat -ano | findstr "端口号"
http://www.lryc.cn/news/612340.html

相关文章:

  • NCD57080CDR2G 安森美onsemi 通用驱动器, SOIC, 8针, 20V电源, 8 A输出NCD57080CDR2电流隔离式栅极驱动器
  • C++11之智能指针
  • harmonyOS学习 - rcp请求
  • 文字转语音tts
  • 鹧鸪云:光伏电站的“智慧中枢”,精准调控逆变器
  • OpenCV校准双目相机并测量距离
  • 10.MTK充电之mt6358-gauge驱动
  • Linux发行版分类与Centos替代品
  • 媒体资产管理系统和OCR文字识别的结合
  • 笔试——Day30
  • 简单介绍cgroups以及在K8s中的应用
  • 小程序中,给一段富文本字符串文案特殊内容加样式监听点击事件
  • 无人机遥控器舵量技术解析
  • cad c#二次开发 图层封装 获取当前层
  • 无人机遥控器波特率技术解析
  • 基于AI的自动驾驶汽车(AI-AV)网络安全威胁缓解框架
  • 开疆智能ModbusTCP转Profinet网关连接EPSON机器人配置案例
  • Docker国内可用镜像(2025.08.06测试)
  • 深入理解数据库连接池(Connection Pool):原理、优势与常见实现
  • wordpress网站的“管理员邮箱地址”有什么用?
  • Linux86 sheel流程控制前瞻4 判断vsftpd服务启动,如果启动,打印端口号,进程id
  • 系统运维之LiveCD详解
  • 【图像处理基石】浅谈3D城市生成中的数据融合技术
  • 【图像处理基石】什么是数字高程模型?如何使用数字高程模型?
  • dify之推送飞书群消息工作流
  • 飞书对接E签宝完整方案
  • 《动手学深度学习》读书笔记—9.7序列到序列学习
  • CPP网络编程-异步sever
  • 内部类详解:Java中的嵌套艺术
  • MATLAB深度学习之数据集-数据库构建方法详解