当前位置: 首页 > 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.xdnf.cn/news/1252477.html

相关文章:

  • Java Stream API 详解(Java 8+)
  • Linux---第二天---基础指令
  • 快速莫比乌斯变换(FMT)与莫比乌斯反演 例题:树上lcm
  • SELinux 安全机制详解与管理
  • 组合期权:跨式策略
  • 批量提问程序开发方案:基于Python的百度文小言接口实现
  • 基于 Jenkins Pipeline 实现 DITA 文档自动化构建与发布(开源方案)
  • 百度智能云给“数字人”发工牌
  • Boosting 知识点整理:调参技巧、可解释性工具与实战案例
  • Bug 记录:SecureRandom.getInstanceStrong()导致验证码获取阻塞
  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • Java 使用动态代理和反射实现字段变更跟踪
  • 生成网站sitemap.xml地图教程
  • 【STM32U385RG 测评】基于VSCode的STM32开发环境搭建
  • 西门子PLC基础指令6:读取时钟指令、设置时钟指令、使能含义与注意
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • JAVA--流程控制语句
  • 【VS + Qt】VS2022 Qt 开发中 ui_xx.h 文件编辑报错但编译正常的问题解决
  • 「iOS」————单例与代理
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘caffe’问题
  • 河南萌新联赛2025第四场-河南大学
  • K8S云原生监控方案Prometheus+grafana
  • yolov1-v3原理解析
  • DHCP 服务器与DNS服务器
  • 服务器——“查询不到显卡驱动,且输入nvidia-smi报错”的解决办法
  • 2.6 sync
  • 媒体资产管理系统和OCR文字识别的结合
  • 多端同步新解法:Joplin+cpolar联合通过开源设计实现跨平台无缝协作?
  • 自动驾驶系统的网络安全风险分析
  • 013 HTTP篇