.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.pswp.cn/news/917961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917961.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

目標檢測數據集 - 眼睛瞳孔檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹:眼睛瞳孔檢測數據集,真實采集高質量人臉眼部圖片數據,適用于人臉定位、人臉疾病如白內障等疾病的視覺檢測。數據標注標簽包括 eyepupil 瞳孔一 個缺陷類別;適用實際項目應用:眼睛瞳孔檢測項目,以…

Keil MDK-ARM V5.42a 完整安裝教程

文章目錄一、安裝前期準備二、Keil MDK-ARM 主程序安裝三、器件支持包(Pack)安裝四、許可證激活五、安裝驗證Keil MDK(Microcontroller Development Kit)是針對 Arm Cortex-M 系列微控制器的專業開發環境,集成了 μVis…

WPF中引用其他元素各種方法

在WPF中,引用其他元素的方式有多種,每種方式適用于不同場景,各有優缺點。除了x:Reference,常用的還有以下幾種: 一、ElementName 綁定(最常用的XAML綁定方式) 通過元素的x:Name屬性引用同一作用…

Python生成統計學公式

一元線性回歸模型 2.1回歸分析概述/25 一、回歸分析基本概念/25 二、總體回歸函數/27 三、隨機誤差項/29 四、樣本回歸函數/30 2.2 一元線性回歸模型的參數估計/32 一、參數估計的普通最小二乘法/32 二、擬合優度/35 2.3基本假設與普通最小二乘估計量的統計性質/36 一、一元線性…

網絡工程師--華為命令專題

一、交換機 交換機分類:1.根據交換方式劃分:(1)存儲轉發式交換(Store and Forward)(2)直通式交換(Cut-through)(3)碎片過濾式交換&…

判斷可編輯div的光標是否在最前面

要判斷一個可編輯div(contenteditable)中的光標是否位于最前面,可以使用以下幾種方法: 方法一:使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity實戰】使用Unity程序化生成3D隨機地牢(附項目源碼)

最終效果 文章目錄最終效果前言1、理解程序生成的核心概念2、種子值的核心作用3、程序生成的實際應用4、主流程序生成技術概覽5、選擇合適的技術實戰1、素材2、生成一面墻變換矩陣數據3、渲染墻壁4、加點隨機不同的墻壁效果5、繪制四面墻壁4、在四個角落生成支柱5、生成地板6、…

多賬號管理方案:解析一款免Root的App分身工具

之前有小伙伴問阿燦有沒有可以軟件分身的免費軟件,后來阿燦找到了一款可以無限分身的app感覺很實用,只有10M大小 02軟件介紹說白了它能給各種app和游戲做分身,包括V信、qQ、某音、某付寶這些,而且支持最新的安卓15系統。每個分身…

(附源碼)基于PHP和Vue的網上購物平臺

內容摘要 內容摘要: 隨著互聯網技術的迅猛發展,網上購物已成為人們日常生活的重要組成部分。本文圍繞PHPVue技術棧構建的網上購物平臺展開研究,深入探討了該平臺的架構設計與實現細節。平臺前端采用Vue框架,利用其組件化開發和數據驅動的特性…

51單片機

中斷系統1.什么是中斷當CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷2.為什么要…

前端開發:HTML(5)—— 表單

下面我們來學習表單。 目錄 什么是Web表單? 表單標簽 1.form標簽 2.輸入框 文本框和密碼框 單選框和復選框 1.單選框 2.復選框 3.按鈕 (1)普通按鈕 (2)提交按鈕 (3)重置按鈕 &#…

【YOLOv8改進 - C2f融合】C2f融合SFS-Conv(空間 - 頻率選擇卷積)提升特征多樣性,同時減少參數和計算量

YOLOv8目標檢測創新改進與實戰案例專欄 專欄目錄: YOLOv8有效改進系列及項目實戰目錄 包含卷積,主干 注意力,檢測頭等創新機制 以及 各種目標檢測分割項目實戰案例 專欄鏈接: YOLOv8基礎解析+創新改進+實戰案例 文章目錄 YOLOv8目標檢測創新改進與實戰案例專欄 介紹 摘要 文…

如何將照片從POCO手機傳輸到Mac電腦

將照片從POCO手機傳輸到Mac電腦可能會有些困難,因為與iPhone不同,POCO設備沒有原生的macOS支持。這常常讓用戶尋找簡單、有效的方法來移動圖片,同時避免丟失質量,節省時間,并避免復雜的軟件設置。如果你想知道如何將照…

最新教程 | CentOS 7 內網環境 Nginx + ECharts 頁面離線部署手冊(RPM 安裝方式)

📁 一、準備階段(在聯網電腦上完成) 1.1 下載 Nginx 官方 RPM 安裝包 在聯網電腦瀏覽器中訪問 Nginx 官方穩定版本倉庫: 🔗 地址:http://nginx.org/packages/centos/7/x86_64/ ??云盤:htt…

Redis 常用數據類型 (下)

文章目錄前言一 Hash 哈希1. Hash 相關命令hset 和 hgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyincrbyfloat2. Hash 命令小結3. Hash 內部編碼Hash 在緩存中的應用場景介紹緩存方式對比二、List 列表1. LIST總體介紹2. List 普通命令lpushlpushxrpushrpushxlrange…

Java Lambda表達式:簡潔高效的函數式編程

1 lambda表達式Lambda 表達式本質是一個匿名函數,用于把函數作為參數,傳入方法中,實現函數式編程風格。使用Lambda 表達式可以使代碼變的更加簡潔緊湊。語法格式:(parameters)-> expression 或 (parameters)->{ statements…

python中的集合

目錄 初識集合 集合的含義 集合的作用 集合的使用場景 集合的定義 集合的常用操作 元素的增加 函數add() 元素的刪除 函數remove() 函數clear() 函數pop() 集合的遍歷 for循環 while循環 初識集合 集合的含義 在pyrhon中,集合是一種內置的數據結構…

如何將普通HTTP API接口改造為MCP服務器

在現代微服務架構中,MCP(Mesh Configuration Protocol) 作為高效配置分發協議,正逐漸替代傳統HTTP API。本文將手把手教你如何將普通HTTP API升級為高性能MCP服務器。 為什么需要MCP? 傳統HTTP API在配置分發場景存在…

數據結構第8問:什么是樹?

樹 【本節僅描述樹的定義、術語以及相關性質】 定義 樹是由若干個結點組成的有限集合。具有如下特征: 有且僅有一個根結點;除根結點外,每個其它結點有且僅有一個直接的父結點;除根結點外,每個結點可以有零個或者多個子…

PyTorch RNN 名字分類器

PyTorch RNN 名字分類器詳解 使用PyTorch實現的字符級RNN(循環神經網絡)項目,用于根據人名預測其所屬的語言/國家。該模型通過學習不同語言名字的字符模式,夠識別名字的語言起源。 環境設置 import torch import string import un…