C#實現(xiàn)訪問遠程硬盤的圖文教程
引言
在現(xiàn)實場景中,我們經(jīng)常用到遠程桌面功能,而在某些場景下,我們需要使用類似的遠程硬盤功能,這樣能非常方便地操作對方電腦磁盤的目錄、以及傳送文件。那么,這樣的遠程硬盤功能要怎么實現(xiàn)了?
這次我們將給出一個完整的Demo來演示遠程硬盤要怎么實現(xiàn),同時,這個Demo也給出了個人網(wǎng)盤是如何實現(xiàn)的。個人網(wǎng)盤可以看做是遠程硬盤應用的一個特例,即,個人網(wǎng)盤就是訪問服務器上的一個特定文件夾。廢話不多說,先上圖看看這個遠程硬盤Demo的基本功能。
一. 遠程硬盤功能展示
打開到對方的遠程磁盤后,我們就可以看到對方電腦的硬盤了,點擊任何一個,就可以訪問該盤下面的文件。
訪問遠程硬盤
雙擊文件,就可以下載文件到本地;右鍵菜單則可以上傳本地文件到遠程磁盤。
傳送文件
二. 遠程硬盤代碼實現(xiàn)
在實現(xiàn)遠程磁盤時,我們分為兩個層面介紹,一個是底層業(yè)務通信層面,另一個是上層的UI展現(xiàn)層面。
1. 底層業(yè)務通信實現(xiàn)
比如,當我們使用遠程磁盤功能時,最常見的就是去獲取對方電腦某個目錄下的所有文件及文件夾,那么,這個功能是怎么實現(xiàn)的了?
基于ESFramework,實現(xiàn)這點其實很簡單,我們舉例說明。以A用戶作為磁盤的分享者,B用戶作為遠程磁盤的訪問者,A和B都啟動了該Demo的客戶端并登錄。此時,B要訪問A用戶電腦上某個目錄下的文件列表,那么,B就可以給A發(fā)一個請求消息,并得到回復,如下所示(NDiskOutter 類的 GetSharedDirectory 方法):
/// <summary> /// 獲取目標用戶電腦上指定目錄下的文件列表信息。 /// </summary> /// <param name="ownerID">目標用戶的賬號(磁盤分享者)</param> /// <param name="clientType">目標用戶的設備類型</param> /// <param name="netDiskID">網(wǎng)盤的標志。(對于遠程磁盤而言,即OwnerID為某個用戶的ID時,該參數(shù)可傳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 //網(wǎng)盤 { res = this.customizeOutter.Query(this.fileDirectoryInfoTypes.ReqDirectory, CompactPropertySerializer.Default.Serialize<ReqDirectoryContract>(contract)); } ResDirectoryContract resContract = CompactPropertySerializer.Default.Deserialize<ResDirectoryContract>(res, 0); return resContract.SharedDirectory; }
無論是網(wǎng)盤,還是遠程磁盤,都可以通過上述的代碼來進行調用,以獲取對方電腦指定目錄下的文件列表。
(1)特別注意,上述代碼中紅色字體突出顯示的Query方法,該方法的含義是:向對方(或服務器)發(fā)送 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 的靜態(tài)方法 GetSharedDirectory 獲取目標目錄下的文件列表和子文件夾列表,并包裝成 SharedDirectory 對象。
(3)將 SharedDirectory 對象序列化成二進制后,返回給請求方。
上面就以請求指定目錄下的文件列表及文件夾列表為例,說明了底層業(yè)務通信的過程。其它的業(yè)務通信就不再贅述了,大家可自行查看源碼。
2. UI 實現(xiàn)
在客戶端,最主要的UI控件就是 NDiskBrowser 的實現(xiàn),它的功能主要有:
(1)瀏覽遠程磁盤下的目錄及文件。
(2)可從遠程磁盤下載文件到本地電腦。
(3)可將本地文件上傳到遠程磁盤。
我們仍然以瀏覽遠程磁盤指定目錄下的所有文件及文件夾為例,來看看 NDiskBrowser 是如何在UI展現(xiàn)的。
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創(chuàng)建日期:{1}", PublicHelper.GetSizeString((uint)file.Size), file.CreateTime); this.listView_fileDirectory.Items.Add(item); }
在通過 NDiskOutter 的 GetSharedDirectory 方法拿到 SharedDirectory 對象后,就將其 SubDirectorys 所包含的每個子文件夾作為 ListViewItem 添加到 ListView 中顯示出來;同時,也將其 FileList 所包含的每個文件作為 ListViewItem 添加到 ListView 中顯示出來。這樣就出現(xiàn)了我們之前截圖的效果。
NDiskBrowser 的實現(xiàn)代碼雖然比較多,但是都很簡單,大家下載源碼后可自行查看。
三. Demo運行示例
1. 運行Demo
(1)運行服務端。
雙擊服務端運行目錄下的 Oraycn.RemoteDisk.Server.exe ,即可啟動服務端,如下截圖所示:
遠程硬盤服務端
(2)運行客戶端。
修改客戶端配置文件 Oraycn.RemoteDisk.exe.config 中的 ServerIP 為運行服務端電腦的 IP地址,然后雙擊 Oraycn.RemoteDisk.exe 啟動客戶端:
遠程硬盤客戶端登錄
賬號密碼隨便填,登錄成功后,進入主界面:
遠程硬盤客戶端主界面
此時,在主界面的輸入框中填上對方的賬號,點擊“訪問他的磁盤”按鈕,如果對方在線,就會彈出此文第一張截圖的窗體了。
如此,我們就可以完全的操控遠程硬盤了。
以上就是C#實現(xiàn)訪問遠程硬盤的圖文教程的詳細內容,更多關于C#訪問遠程硬盤的資料請關注腳本之家其它相關文章!
相關文章
C#使用FtpWebRequest與FtpWebResponse完成FTP操作
這篇文章介紹了C#使用FtpWebRequest與FtpWebResponse完成FTP操作的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05DevExpress實現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點
這篇文章主要介紹了DevExpress實現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點,需要的朋友可以參考下2014-08-08C#設計模式之Observer觀察者模式解決牛頓童鞋成績問題示例
這篇文章主要介紹了C#設計模式之Observer觀察者模式解決牛頓童鞋成績問題,簡單講述了觀察者模式的原理并結合具體實例形式分析了使用觀察者模式解決牛頓童鞋成績問題的具體步驟相關操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-09-09C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實現(xiàn)方法
這篇文章主要介紹了C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁信息實現(xiàn)方法,涉及C#基于會話操作登陸網(wǎng)頁及頁面讀取相關操作技巧,需要的朋友可以參考下2017-05-05