C#實現訪問遠程硬盤(附源碼)

在現實場景中,我們經常用到遠程桌面功能,而在某些場景下,我們需要使用類似的遠程硬盤功能,這樣能非常方便地操作對方電腦磁盤的目錄、以及傳送文件。那么,這樣的遠程硬盤功能要怎么實現了?

這次我們將給出一個完整的Demo來演示遠程硬盤要怎么實現,同時,這個Demo也給出了個人網盤是如何實現的。個人網盤可以看做是遠程硬盤應用的一個特例,即,個人網盤就是訪問服務器上的一個特定文件夾。廢話不多說,先上圖看看這個遠程硬盤Demo的基本功能。

一. 遠程硬盤功能展示

打開到對方的遠程磁盤后,我們就可以看到對方電腦的硬盤了,點擊任何一個,就可以訪問該盤下面的文件。

訪問遠程硬盤

雙擊文件,就可以下載文件到本地;右鍵菜單則可以上傳本地文件到遠程磁盤。

傳送文件

二. 遠程硬盤代碼實現

在實現遠程磁盤時,我們分為兩個層面介紹,一個是底層業務通信層面,另一個是上層的UI展現層面。

1. 底層業務通信實現

比如,當我們使用遠程磁盤功能時,最常見的就是去獲取對方電腦某個目錄下的所有文件及文件夾,那么,這個功能是怎么實現的了?

基于ESFramework,實現這點其實很簡單,我們舉例說明。以A用戶作為磁盤的分享者,B用戶作為遠程磁盤的訪問者,A和B都啟動了該Demo的客戶端并登錄。此時,B要訪問A用戶電腦上某個目錄下的文件列表,那么,B就可以給A發一個請求消息,并得到回復,如下所示(NDiskOutter 類的 GetSharedDirectory 方法):? ? ?

/// <summary>
/// 獲取目標用戶電腦上指定目錄下的文件列表信息。
/// </summary>
/// <param name="ownerID">目標用戶的賬號(磁盤分享者)</param>
/// <param name="clientType">目標用戶的設備類型</param>
/// <param name="netDiskID">網盤的標志。(對于遠程磁盤而言,即OwnerID為某個用戶的ID時,該參數可傳null)。如果是群組共享的文件夾,則可以將其設置為對應的群組的ID。</param>
/// <param name="dirPath">指定目錄的路徑</param>
/// <returns>目錄下的文件列表信息</returns>
public SharedDirectory GetSharedDirectory(string ownerID,ClientType clientType,string netDiskID ,string dirPath)
{ReqDirectoryContract contract = new ReqDirectoryContract(netDiskID, dirPath);byte[] res;if (!ownerID.Equals(NetServer.SystemUserID)) //遠程磁盤{res = this.p2pQueryOutter.Query(ownerID, clientType, this.fileDirectoryInfoTypes.ReqDirectory, CompactPropertySerializer.Default.Serialize<ReqDirectoryContract>(contract), "");}else //網盤{res = this.customizeOutter.Query(this.fileDirectoryInfoTypes.ReqDirectory, CompactPropertySerializer.Default.Serialize<ReqDirectoryContract>(contract));}ResDirectoryContract resContract = CompactPropertySerializer.Default.Deserialize<ResDirectoryContract>(res, 0);return resContract.SharedDirectory;
}

無論是網盤,還是遠程磁盤,都可以通過上述的代碼來進行調用,以獲取對方電腦指定目錄下的文件列表。

(1)特別注意,上述代碼中紅色字體突出顯示的Query方法,該方法的含義是:向對方(或服務器)發送?ReqDirectory?請求,并返回對方的應答結果。

(2)返回的 SharedDirectory 對象,里面包含了目錄下的文件列表和子文件夾列表,可以通過?FileList 和 SubDirectorys 屬性獲取。

那么,A作為分享方,是如何處理來自B的?ReqDirectory?請求的了?

我們來看看 NDiskPassiveHandler 類的 HandleQuery 方法中對 ReqDirectory 請求的處理:

if (informationType == this.fileDirectoryInfoTypes.ReqDirectory){ReqDirectoryContract contract = CompactPropertySerializer.Default.Deserialize<ReqDirectoryContract>(info, 0);string fullPath = this.ConstructFullPath(contract.DirectoryPath);SharedDirectory dir = SharedDirectory.GetSharedDirectory(fullPath);return CompactPropertySerializer.Default.Serialize<ResDirectoryContract>(new ResDirectoryContract(dir));}

(1)首先,將二進制請求消息反序列化為 ReqDirectoryContract 對象,從中拿到對方想要請求的目錄路徑。

(2)通過?SharedDirectory 的靜態方法?GetSharedDirectory 獲取目標目錄下的文件列表和子文件夾列表,并包裝成?SharedDirectory 對象。

(3)將?SharedDirectory 對象序列化成二進制后,返回給請求方。

? ? ? 上面就以請求指定目錄下的文件列表及文件夾列表為例,說明了底層業務通信的過程。其它的業務通信就不再贅述了,大家可自行查看源碼。

2. UI 實現?

? ? ? 在客戶端,最主要的UI控件就是 NDiskBrowser 的實現,它的功能主要有:

(1)瀏覽遠程磁盤下的目錄及文件。

(2)可從遠程磁盤下載文件到本地電腦。

(3)可將本地文件上傳到遠程磁盤。

? ? ? 我們仍然以瀏覽遠程磁盤指定目錄下的所有文件及文件夾為例,來看看?NDiskBrowser 是如何在UI展現的。

SharedDirectory sharedDirectory = this.nDiskOutter.GetSharedDirectory(this.ownerID, this.clientType, this.netDiskID , path);foreach (DirectoryDetail dirDetail in sharedDirectory.SubDirectorys)
{ListViewItem item = new ListViewItem(new string[] { dirDetail.Name, dirDetail.CreateTime.ToString(), "" }, 0);item.Tag = new FileOrDirectoryTag(dirDetail.Name, 0, dirDetail.CreateTime, false);this.listView_fileDirectory.Items.Add(item);
}foreach (FileDetail file in sharedDirectory.FileList)
{ListViewItem item = new ListViewItem(new string[] { file.Name, file.CreateTime.ToString(), PublicHelper.GetSizeString((uint)file.Size) }, this.GetIconIndex(file.Name));item.Tag = new FileOrDirectoryTag(file.Name, file.Size, file.CreateTime, true);item.ToolTipText = string.Format("大    小:{0}\n創建日期:{1}", PublicHelper.GetSizeString((uint)file.Size), file.CreateTime);this.listView_fileDirectory.Items.Add(item);
}

?? 在通過 NDiskOutter 的 GetSharedDirectory 方法拿到?SharedDirectory 對象后,就將其?SubDirectorys 所包含的每個子文件夾作為?ListViewItem? 添加到 ListView 中顯示出來;同時,也將其 FileList 所包含的每個文件作為?ListViewItem? 添加到 ListView 中顯示出來。這樣就出現了我們之前截圖的效果。

? ? ??NDiskBrowser 的實現代碼雖然比較多,但是都很簡單,大家下載源碼后可自行查看。

三. 下載Demo源碼及運行

1. Demo 源碼下載:Oraycn.RemoteDisk.rar

2. 運行Demo

(1)運行服務端。

雙擊服務端運行目錄下的 Oraycn.RemoteDisk.Server.exe?,即可啟動服務端,如下截圖所示:

遠程硬盤服務端

(2)運行客戶端。

修改客戶端配置文件 Oraycn.RemoteDisk.exe.config 中的?ServerIP 為運行服務端電腦的 IP地址,然后雙擊?Oraycn.RemoteDisk.exe 啟動客戶端:?

遠程硬盤客戶端登錄

賬號密碼隨便填,登錄成功后,進入主界面:

遠程硬盤客戶端主界面

此時,在主界面的輸入框中填上對方的賬號,點擊“訪問他的磁盤”按鈕,如果對方在線,就會彈出此文第一張截圖的窗體了。

如此,我們就可以完全的操控遠程硬盤了。

關于遠程硬盤,如果您有什么好點子,歡迎留言和我討論,謝謝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81067.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81067.shtml

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

相關文章

02.Golang 切片(slice)源碼分析(一、定義與基礎操作實現)

Golang 切片&#xff08;slice&#xff09;源碼分析&#xff08;一、定義與基礎操作實現&#xff09; 注意當前go版本代碼為1.23 一、定義 slice 的底層數據是數組&#xff0c;slice 是對數組的封裝&#xff0c;它描述一個數組的片段。兩者都可以通過下標來訪問單個元素。 數…

記參加一次數學建模

題目請到全國大學生數學建模競賽下載查看。 注&#xff1a;過程更新了很多文件&#xff0c;所有這里貼上的有些內容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我們隊伍并沒有獲獎&#xff0c;文章內容僅供一樂。 從這次比賽&#xff0c;給出以下賽前建議 …

virtualbox虛擬機中的ubuntu 20.04.6安裝新的linux內核5.4.293 | 并增加一個系統調用 | 證書問題如何解決

參考文章&#xff1a;linux添加系統調用【簡單易懂】【含32位系統】【含64位系統】_64位 32位 系統調用-CSDN博客 安裝新內核 1. 在火狐下載你需要的版本的linux內核壓縮包 這里我因為在windows上面下載過&#xff0c;配置過共享文件夾&#xff0c;所以直接復制粘貼通過共享文…

[Java實戰]Spring Boot 3 整合 Ehcache 3(十九)

[Java實戰]Spring Boot 3 整合 Ehcache 3&#xff08;十九&#xff09; 引言 在微服務和高并發場景下&#xff0c;緩存是提升系統性能的關鍵技術之一。Ehcache 作為 Java 生態中成熟的內存緩存框架&#xff0c;其 3.x 版本在性能、功能和易用性上均有顯著提升。本文將詳細介紹…

LlamaIndex 第九篇 Indexing索引

索引概述 數據加載完成后&#xff0c;您將獲得一個文檔對象(Document)列表&#xff08;或節點(Node)列表&#xff09;。接下來需要為這些對象構建索引(Index)&#xff0c;以便開始執行查詢。 索引&#xff08;Index&#xff09; 是一種數據結構&#xff0c;能夠讓我們快速檢索…

【問題排查】easyexcel日志打印Empty row!

問題原因 日志打印??I/O 操作開銷?&#xff08;如 Log4j 的 FileAppender&#xff09;會阻塞業務線程&#xff0c;直到日志寫入完成&#xff0c;導致接口響應變慢 問題描述 在線上環境&#xff0c;客戶反饋導入一個不到1MB的excel文件&#xff0c;耗時將近5分鐘。 問題排…

代碼隨想錄第51天|島嶼數量(深搜)、島嶼數量(廣搜)、島嶼的最大面積

1.島嶼數量&#xff08;深搜&#xff09; ---》模板題 版本一寫法&#xff1a;下一個節點是否能合法已經判斷完了&#xff0c;傳進dfs函數的就是合法節點。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 從影視到游戲:《魷魚游戲》IP 的邊界拓展

優質IP的跨媒體開發潛力不可限量。以現象級劇集《魷魚游戲》為例&#xff0c;Netflix旗下游戲工作室Boss Fight在第二季開播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一經發布便橫掃全球107個國家和地區的App Store免費游戲榜首。 這款多人派對大逃殺游戲完美還原…

allure 報告更改標題和語言為中文

在網上看到好多談到更改allure 的標題設置都很麻煩&#xff0c;去更改JSON文件 其實可以有更簡單的辦法&#xff0c;就是在生成報表時增加參數 使用allure --help 查看&#xff1a; --lang, --report-language 設置報告的語言&#xff0c;默認是應用 The report language. …

HGDB索引膨脹的檢查與處理思路

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.8 文檔用途 本文檔主要介紹HGDB索引膨脹的定義、產生的原因、如何檢查以及遇到索引膨脹如何處理&#xff08;包括預防和解決&#xff09; 詳細信息 …

【Python CGI編程】

Python CGI&#xff08;通用網關接口&#xff09;編程是早期Web開發中實現動態網頁的技術方案。以下是系統化指南&#xff0c;包含核心概念、實現步驟及安全實踐&#xff1a; 一、CGI 基礎概念 1. 工作原理 瀏覽器請求 → Web服務器&#xff08;如Apache&#xff09; → 執行…

數據庫故障排查指南:從入門到精通

1. 常見數據庫故障類型 1.1 連接故障 數據庫連接超時連接池耗盡網絡連接中斷認證失敗1.2 性能故障 查詢執行緩慢內存使用過高CPU使用率異常磁盤I/O瓶頸1.3 數據故障 數據不一致數據丟失數據損壞事務失敗2. 故障排查流程 2.1 初步診斷 -- 檢查數據庫狀態SHOW STATUS;SHOW PRO…

conda創建環境常用命令(個人用)

創建環境 conda create --name your_project_name創建環境 ---- 指定環境python版本 conda create --name your_project_name python3.x環境列表 conda env list激活環境 conda activate your_project_name退出環境 conda deactivate環境列表 #使用conda命令 conda list …

PCL 繪制二次曲面

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文講透面向對象編程OOP特點及應用場景

面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;是一種以對象為核心、通過類組織代碼的編程范式。它通過模擬現實世界的實體和交互來構建軟件系統&#xff0c;是現代軟件開發中最廣泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我啟動一個springboot項目, 用java -jar xxx.jar ,但是沒多久這個java進程就會自動關掉

當使用 java -jar xxx.jar & 啟動 Spring Boot 項目后進程自動關閉時&#xff0c;可能由多種原因導致。以下是常見排查步驟和解決方案&#xff1a; 一、查看日志定位原因 進程異常關閉通常會在控制臺或日志中留下線索&#xff0c;建議先獲取完整日志&#xff1a; 1. 查看…

【獨家精簡】win11(24h2)清爽加速版

自作該版本的初心&#xff1a;隨著電腦性能的不斷提升&#xff0c;我們需要的更多的是沒有廣告&#xff0c;沒有推薦&#xff0c;沒有收集隱私的windows清爽版純凈系統 目前只會去制作windows系統專業版 1、去除Windows系統自帶的廣告新聞和推薦以及小組間和聊天功能。 2、精簡…

大二java第一面小廠(掛)

第一場&#xff1a; mybatis怎么防止數據轉義。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多級緩存。 websocket怎么實現的多人協作編輯功能。 怎么實現的分庫分表。 mysql里面的各種操作&#xff0c;比如說分表怎么分&#xff0c;分頁查詢怎么用。 mybat…

OceanBase 的系統變量、配置項和用戶變量有何差異

在繼續閱讀本文之前&#xff0c;大家不妨先思考一下&#xff0c;數據庫中“系統變量”、“用戶變量”以及“配置項”這三者之間有何不同。如果感到有些模糊&#xff0c;那么本文將是您理清這些概念的好幫手。 很多用戶在使用OceanBase數據庫中的“配置項”和“系統變量”&#…

HTML-3.3 表格布局(學校官網簡易布局實例)

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 系列文章目錄 HTML-1.1 文本字體樣式-字體設置、分割線、段落標簽、段內回車以及特殊符號 HTML…