it编程 > 编程语言 > Asp.net

C#实现访问远程硬盘的图文教程

24人参与 2025-05-19 Asp.net

引言

在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么,这样的远程硬盘功能要怎么实现了?

这次我们将给出一个完整的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

(1)运行服务端。

双击服务端运行目录下的 oraycn.remotedisk.server.exe ,即可启动服务端,如下截图所示:

远程硬盘服务端

(2)运行客户端。

修改客户端配置文件 oraycn.remotedisk.exe.config 中的 serverip 为运行服务端电脑的 ip地址,然后双击 oraycn.remotedisk.exe 启动客户端: 

远程硬盘客户端登录

账号密码随便填,登录成功后,进入主界面:

远程硬盘客户端主界面

此时,在主界面的输入框中填上对方的账号,点击“访问他的磁盘”按钮,如果对方在线,就会弹出此文第一张截图的窗体了。

如此,我们就可以完全的操控远程硬盘了。

以上就是c#实现访问远程硬盘的图文教程的详细内容,更多关于c#访问远程硬盘的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

Core i5-12400F搭配RTX 5070 Ti合理吗? 七款游戏性能测评

05-19

C#中ThreadStart委托的实现

05-20

Linux使用perf跟踪.NET程序的mmap泄露的流程步骤

05-20

C#使用ClosedXML进行读写excel操作

05-21

C#继承之里氏替换原则分析

05-21

基于C#创建高效自定义图像显示控件

05-18

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论