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

2025-05-20 02:50

本文主要是介绍C#实现访问远程硬盘的图文教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的...

引言

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

这次我们将给出一个完整的Demo来演示远程硬盘要怎么实现,同时,这个Demo也给出了个人网盘是如何实现的。个人网盘可以看做是远程硬盘应用的一个特例,即,个人网盘就python是访问服务器上的一个特定文件夹。废话不多说,先上图看看这个远程硬盘Demo的基本功能。

一. 远程硬盘功能展示

打开到对方的远程磁盘后,我们就可以看到对方电脑的硬盘了,点击任何一个,就可以访问该盘下面的文件。

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

访问远程硬盘

双击文件,就可以下载文件到本地;右键菜单则可以上传本地文件到远程磁盘。

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

传送文件

二. 远程硬盘代码实现

在实现远程磁盘时,我们分为两个层面介绍,一个是底层业务通信层面,另一个是上层的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 (injsformationType == 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.GetSiz编程eString((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 的 GetSharpythonedDirectory 方法拿到 SharedDirectory 对象后,就将其 SubDirectorys 所包含的每个子文件夹作为 ListViewItem  添加到 ListView 中显示出来;同时,也将其 FileList 所包含的每个文件作为 ListViewItem  添加到 ListView 中显示出来。这样就出现了我们之前截图的效果。

NDiskBrowser 的实现代码虽然比较多,但是都很简单,大家下载源码后可自行查看。

三. Demo运行示例

1. 运行Demo

(1)运行服务端。

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

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

远程硬盘服务端

(2)运行客户端。

修改客户端配置文件 Oraycn.RemoteDisk.exe.config 中的 ServerIP 为运行服务端电脑的 IP地址,然后双击 Oraycn.RemoteDisk.exe 启动客户端: 

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

远程硬盘客户端登录

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

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

远程硬盘客户端主界面

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

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

以上就是C#实现访问远程硬盘的图文教程的详细内容,更多关于C#访问远程硬盘的资料请关注China编程(www.chinasem.cn)其它相关文编程China编程章!

这篇关于C#实现访问远程硬盘的图文教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154680

相关文章

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF