---
id: dmtpremoteaccess
title: 远程文件系统
---
import Tag from "@site/src/components/Tag.js";

## 一、说明 <Tag>Pro</Tag>

使用该插件，可以访问远程终端的文件系统。包括：创建、删除、复制、移动、获取信息等。

## 二、使用

该功能由`RemoteAccessFeature`功能插件提供。所以需要`客户端`和`服务器`都需要`UseRemoteAccess`。

```csharp showLineNumbers
.ConfigurePlugins(a =>
{
    a.UseRemoteAccess();
});
```

以获取文件夹信息为例：

【请求端】

任意Dmtp终端均可以调用GetRemoteAccessActor创建一个访问器。

同时可以传递一个元数据组。用于载入自定义消息。

```csharp showLineNumbers
var result = await this.m_client.GetRemoteAccessActor().GetDirectoryInfoAsync("c:/新建文件夹", millisecondsTimeout: 30 * 1000);

//然后通过DirectoryInfo属性，可以获取到请求文件夹的信息，包括创建时间、修改时间、子文件夹、子文件等。
```

:::tip 提示

此处可以访问远程终端的文件系统。包括：创建、删除、复制、移动、获取信息等

:::  


【响应端】

响应端定义一个插件，实现`IDmtpRemoteAccessingPlugin`，然后实现接口。

```csharp showLineNumbers
public class MyRemoteAccessPlugin : PluginBase, IDmtpRemoteAccessingPlugin
{
    public async Task OnRemoteAccessing(IDmtpActorObject client, RemoteAccessingEventArgs e)
    {
        //Console.WriteLine($"有客户端正在请求远程操作");
        //Console.WriteLine($"类型：{e.AccessType}，模式：{e.AccessMode}");
        //Console.WriteLine($"请求路径：{e.Path}");
        //Console.WriteLine($"目标路径：{e.TargetPath}");

        //Console.WriteLine("请输入y/n决定是否允许其操作?");

        //var input = Console.ReadLine();
        //if (input == "y")
        //{
        //    e.IsPermitOperation = true;
        //    return;
        //}

        //如果当前插件无法处理，转至下一个插件
        await e.InvokeNext();
    }
}
```

:::caution 警告

远程文件系统访问，是属于比较隐私的功能，所以在开发这功能时，应该取得被访问端的访问许可，所以在每次访问时，都必须对`e.IsPermitOperation = true`做确认动作。

:::  

[本文示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Dmtp/RemoteAccessApp)