24人参与 • 2025-05-19 • Asp.net
在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么,这样的远程硬盘功能要怎么实现了?
这次我们将给出一个完整的demo来演示远程硬盘要怎么实现,同时,这个demo也给出了个人网盘是如何实现的。个人网盘可以看做是远程硬盘应用的一个特例,即,个人网盘就是访问服务器上的一个特定文件夹。废话不多说,先上图看看这个远程硬盘demo的基本功能。
打开到对方的远程磁盘后,我们就可以看到对方电脑的硬盘了,点击任何一个,就可以访问该盘下面的文件。
访问远程硬盘
双击文件,就可以下载文件到本地;右键菜单则可以上传本地文件到远程磁盘。
传送文件
在实现远程磁盘时,我们分为两个层面介绍,一个是底层业务通信层面,另一个是上层的ui展现层面。
比如,当我们使用远程磁盘功能时,最常见的就是去获取对方电脑某个目录下的所有文件及文件夹,那么,这个功能是怎么实现的了?
基于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 对象序列化成二进制后,返回给请求方。
上面就以请求指定目录下的文件列表及文件夹列表为例,说明了底层业务通信的过程。其它的业务通信就不再赘述了,大家可自行查看源码。
在客户端,最主要的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 的实现代码虽然比较多,但是都很简单,大家下载源码后可自行查看。
1. 运行demo
(1)运行服务端。
双击服务端运行目录下的 oraycn.remotedisk.server.exe ,即可启动服务端,如下截图所示:
远程硬盘服务端
(2)运行客户端。
修改客户端配置文件 oraycn.remotedisk.exe.config 中的 serverip 为运行服务端电脑的 ip地址,然后双击 oraycn.remotedisk.exe 启动客户端:
远程硬盘客户端登录
账号密码随便填,登录成功后,进入主界面:
远程硬盘客户端主界面
此时,在主界面的输入框中填上对方的账号,点击“访问他的磁盘”按钮,如果对方在线,就会弹出此文第一张截图的窗体了。
如此,我们就可以完全的操控远程硬盘了。
以上就是c#实现访问远程硬盘的图文教程的详细内容,更多关于c#访问远程硬盘的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论