C#實(shí)現(xiàn)訪問(wèn)遠(yuǎn)程硬盤(pán)的圖文教程
引言
在現(xiàn)實(shí)場(chǎng)景中,我們經(jīng)常用到遠(yuǎn)程桌面功能,而在某些場(chǎng)景下,我們需要使用類似的遠(yuǎn)程硬盤(pán)功能,這樣能非常方便地操作對(duì)方電腦磁盤(pán)的目錄、以及傳送文件。那么,這樣的遠(yuǎn)程硬盤(pán)功能要怎么實(shí)現(xiàn)了?
這次我們將給出一個(gè)完整的Demo來(lái)演示遠(yuǎn)程硬盤(pán)要怎么實(shí)現(xiàn),同時(shí),這個(gè)Demo也給出了個(gè)人網(wǎng)盤(pán)是如何實(shí)現(xiàn)的。個(gè)人網(wǎng)盤(pán)可以看做是遠(yuǎn)程硬盤(pán)應(yīng)用的一個(gè)特例,即,個(gè)人網(wǎng)盤(pán)就是訪問(wèn)服務(wù)器上的一個(gè)特定文件夾。廢話不多說(shuō),先上圖看看這個(gè)遠(yuǎn)程硬盤(pán)Demo的基本功能。
一. 遠(yuǎn)程硬盤(pán)功能展示
打開(kāi)到對(duì)方的遠(yuǎn)程磁盤(pán)后,我們就可以看到對(duì)方電腦的硬盤(pán)了,點(diǎn)擊任何一個(gè),就可以訪問(wèn)該盤(pán)下面的文件。

訪問(wèn)遠(yuǎn)程硬盤(pán)
雙擊文件,就可以下載文件到本地;右鍵菜單則可以上傳本地文件到遠(yuǎn)程磁盤(pán)。

傳送文件
二. 遠(yuǎn)程硬盤(pán)代碼實(shí)現(xiàn)
在實(shí)現(xiàn)遠(yuǎn)程磁盤(pán)時(shí),我們分為兩個(gè)層面介紹,一個(gè)是底層業(yè)務(wù)通信層面,另一個(gè)是上層的UI展現(xiàn)層面。
1. 底層業(yè)務(wù)通信實(shí)現(xiàn)
比如,當(dāng)我們使用遠(yuǎn)程磁盤(pán)功能時(shí),最常見(jiàn)的就是去獲取對(duì)方電腦某個(gè)目錄下的所有文件及文件夾,那么,這個(gè)功能是怎么實(shí)現(xiàn)的了?
基于ESFramework,實(shí)現(xiàn)這點(diǎn)其實(shí)很簡(jiǎn)單,我們舉例說(shuō)明。以A用戶作為磁盤(pán)的分享者,B用戶作為遠(yuǎn)程磁盤(pán)的訪問(wèn)者,A和B都啟動(dòng)了該Demo的客戶端并登錄。此時(shí),B要訪問(wèn)A用戶電腦上某個(gè)目錄下的文件列表,那么,B就可以給A發(fā)一個(gè)請(qǐng)求消息,并得到回復(fù),如下所示(NDiskOutter 類的 GetSharedDirectory 方法):
/// <summary>
/// 獲取目標(biāo)用戶電腦上指定目錄下的文件列表信息。
/// </summary>
/// <param name="ownerID">目標(biāo)用戶的賬號(hào)(磁盤(pán)分享者)</param>
/// <param name="clientType">目標(biāo)用戶的設(shè)備類型</param>
/// <param name="netDiskID">網(wǎng)盤(pán)的標(biāo)志。(對(duì)于遠(yuǎn)程磁盤(pán)而言,即OwnerID為某個(gè)用戶的ID時(shí),該參數(shù)可傳null)。如果是群組共享的文件夾,則可以將其設(shè)置為對(duì)應(yīng)的群組的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)) //遠(yuǎn)程磁盤(pán)
{
res = this.p2pQueryOutter.Query(ownerID, clientType, this.fileDirectoryInfoTypes.ReqDirectory, CompactPropertySerializer.Default.Serialize<ReqDirectoryContract>(contract), "");
}
else //網(wǎng)盤(pán)
{
res = this.customizeOutter.Query(this.fileDirectoryInfoTypes.ReqDirectory, CompactPropertySerializer.Default.Serialize<ReqDirectoryContract>(contract));
}
ResDirectoryContract resContract = CompactPropertySerializer.Default.Deserialize<ResDirectoryContract>(res, 0);
return resContract.SharedDirectory;
}無(wú)論是網(wǎng)盤(pán),還是遠(yuǎn)程磁盤(pán),都可以通過(guò)上述的代碼來(lái)進(jìn)行調(diào)用,以獲取對(duì)方電腦指定目錄下的文件列表。
(1)特別注意,上述代碼中紅色字體突出顯示的Query方法,該方法的含義是:向?qū)Ψ剑ɑ蚍?wù)器)發(fā)送 ReqDirectory 請(qǐng)求,并返回對(duì)方的應(yīng)答結(jié)果。
(2)返回的 SharedDirectory 對(duì)象,里面包含了目錄下的文件列表和子文件夾列表,可以通過(guò) FileList 和 SubDirectorys 屬性獲取。
那么,A作為分享方,是如何處理來(lái)自B的 ReqDirectory 請(qǐng)求的了?
我們來(lái)看看 NDiskPassiveHandler 類的 HandleQuery 方法中對(duì) ReqDirectory 請(qǐng)求的處理:
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)首先,將二進(jìn)制請(qǐng)求消息反序列化為 ReqDirectoryContract 對(duì)象,從中拿到對(duì)方想要請(qǐng)求的目錄路徑。
(2)通過(guò) SharedDirectory 的靜態(tài)方法 GetSharedDirectory 獲取目標(biāo)目錄下的文件列表和子文件夾列表,并包裝成 SharedDirectory 對(duì)象。
(3)將 SharedDirectory 對(duì)象序列化成二進(jìn)制后,返回給請(qǐng)求方。
上面就以請(qǐng)求指定目錄下的文件列表及文件夾列表為例,說(shuō)明了底層業(yè)務(wù)通信的過(guò)程。其它的業(yè)務(wù)通信就不再贅述了,大家可自行查看源碼。
2. UI 實(shí)現(xiàn)
在客戶端,最主要的UI控件就是 NDiskBrowser 的實(shí)現(xiàn),它的功能主要有:
(1)瀏覽遠(yuǎn)程磁盤(pán)下的目錄及文件。
(2)可從遠(yuǎn)程磁盤(pán)下載文件到本地電腦。
(3)可將本地文件上傳到遠(yuǎn)程磁盤(pán)。
我們?nèi)匀灰詾g覽遠(yuǎn)程磁盤(pán)指定目錄下的所有文件及文件夾為例,來(lái)看看 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);
}在通過(guò) NDiskOutter 的 GetSharedDirectory 方法拿到 SharedDirectory 對(duì)象后,就將其 SubDirectorys 所包含的每個(gè)子文件夾作為 ListViewItem 添加到 ListView 中顯示出來(lái);同時(shí),也將其 FileList 所包含的每個(gè)文件作為 ListViewItem 添加到 ListView 中顯示出來(lái)。這樣就出現(xiàn)了我們之前截圖的效果。
NDiskBrowser 的實(shí)現(xiàn)代碼雖然比較多,但是都很簡(jiǎn)單,大家下載源碼后可自行查看。
三. Demo運(yùn)行示例
1. 運(yùn)行Demo
(1)運(yùn)行服務(wù)端。
雙擊服務(wù)端運(yùn)行目錄下的 Oraycn.RemoteDisk.Server.exe ,即可啟動(dòng)服務(wù)端,如下截圖所示:

遠(yuǎn)程硬盤(pán)服務(wù)端
(2)運(yùn)行客戶端。
修改客戶端配置文件 Oraycn.RemoteDisk.exe.config 中的 ServerIP 為運(yùn)行服務(wù)端電腦的 IP地址,然后雙擊 Oraycn.RemoteDisk.exe 啟動(dòng)客戶端:

遠(yuǎn)程硬盤(pán)客戶端登錄
賬號(hào)密碼隨便填,登錄成功后,進(jìn)入主界面:

遠(yuǎn)程硬盤(pán)客戶端主界面
此時(shí),在主界面的輸入框中填上對(duì)方的賬號(hào),點(diǎn)擊“訪問(wèn)他的磁盤(pán)”按鈕,如果對(duì)方在線,就會(huì)彈出此文第一張截圖的窗體了。
如此,我們就可以完全的操控遠(yuǎn)程硬盤(pán)了。
以上就是C#實(shí)現(xiàn)訪問(wèn)遠(yuǎn)程硬盤(pán)的圖文教程的詳細(xì)內(nèi)容,更多關(guān)于C#訪問(wèn)遠(yuǎn)程硬盤(pán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用FtpWebRequest與FtpWebResponse完成FTP操作
這篇文章介紹了C#使用FtpWebRequest與FtpWebResponse完成FTP操作的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
DevExpress實(shí)現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點(diǎn)
這篇文章主要介紹了DevExpress實(shí)現(xiàn)TreeList向上遞歸獲取符合條件的父節(jié)點(diǎn),需要的朋友可以參考下2014-08-08
C#結(jié)合html2canvas切割圖片并導(dǎo)出到PDF
html2canvas?是一個(gè)?JavaScript?庫(kù),它可以把任意一個(gè)網(wǎng)頁(yè)中的元素繪制到指定的?canvas?中,本文將結(jié)合html2canvas進(jìn)行切割圖片并導(dǎo)出到PDF,感興趣的可以了解下2025-02-02
C#.Net基于正則表達(dá)式抓取百度百家文章列表的方法示例
這篇文章主要介紹了C#.Net基于正則表達(dá)式抓取百度百家文章列表的方法,結(jié)合實(shí)例形式分析了C#獲取百度百家文章內(nèi)容及使用正則表達(dá)式匹配標(biāo)題、內(nèi)容、地址等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
C#設(shè)計(jì)模式之Observer觀察者模式解決牛頓童鞋成績(jī)問(wèn)題示例
這篇文章主要介紹了C#設(shè)計(jì)模式之Observer觀察者模式解決牛頓童鞋成績(jī)問(wèn)題,簡(jiǎn)單講述了觀察者模式的原理并結(jié)合具體實(shí)例形式分析了使用觀察者模式解決牛頓童鞋成績(jī)問(wèn)題的具體步驟相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-09-09
C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁(yè)信息實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用WebClient登錄網(wǎng)站并抓取登錄后的網(wǎng)頁(yè)信息實(shí)現(xiàn)方法,涉及C#基于會(huì)話操作登陸網(wǎng)頁(yè)及頁(yè)面讀取相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
c#將list類型轉(zhuǎn)換成DataTable方法示例
將List類型轉(zhuǎn)換成DataTable的通用方法,大家參考使用吧2013-12-12

