You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# MAUI Android应用中连接Asustor NAS网络驱动器

在MAUI Android中访问Asustor NAS实现文件传输的解决方案

首先明确:mpr.dll是Windows系统专属的网络映射API,Android系统不存在这个文件,所以这个方案在Android上完全不可行,必须换用SMB协议直接访问——Asustor NAS默认支持SMB服务,这是跨平台访问NAS的标准方式。

下面提供两种可行的实现方案:

方案一:使用.NET SMB第三方库(SharpSmbLib)

这是跨平台最方便的方式,无需依赖Android原生API,直接在MAUI项目中编写通用代码即可。

  1. 安装NuGet包
    在项目管理器中安装SharpSmbLib,或者在Package Manager Console执行:

    Install-Package SharpSmbLib
    
  2. 核心代码示例

    using SharpSmbLib;
    using SharpSmbLib.SMB2;
    using System.IO;
    
    // 连接NAS并上传文件
    public async Task UploadFileToNas(string nasIp, string shareName, string username, string password, string localFilePath, string remoteFileName)
    {
        // 创建SMB客户端
        using var client = new Smb2Client();
        // 连接NAS服务器(SMB默认端口445)
        client.Connect(nasIp, 445);
        // 登录验证
        client.Login(username, password);
    
        // 访问指定共享文件夹
        using var share = client.TreeConnect($"\\\\{nasIp}\\{shareName}");
    
        // 读取本地文件并写入远程文件
        using var localFileStream = File.OpenRead(localFilePath);
        using var remoteFileStream = share.CreateFile(remoteFileName, FileAccessMask.GENERIC_WRITE, CreateDisposition.FILE_OVERWRITE_IF, FileAttributes.NORMAL);
    
        await localFileStream.CopyToAsync(remoteFileStream);
    }
    
    // 从NAS下载文件
    public async Task DownloadFileFromNas(string nasIp, string shareName, string username, string password, string remoteFileName, string localFilePath)
    {
        using var client = new Smb2Client();
        client.Connect(nasIp, 445);
        client.Login(username, password);
    
        using var share = client.TreeConnect($"\\\\{nasIp}\\{shareName}");
        using var remoteFileStream = share.OpenFile(remoteFileName, FileAccessMask.GENERIC_READ);
        using var localFileStream = File.Create(localFilePath);
    
        await remoteFileStream.CopyToAsync(localFileStream);
    }
    
  3. 权限配置
    在Android项目的AndroidManifest.xml中添加网络权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    如需读写本地存储文件,需额外添加对应存储权限(根据Android版本适配)。

方案二:使用Android原生SMB API(Android 12+)

如果只针对Android 12及以上版本开发,可使用系统原生SMB API,避免引入第三方库。

  1. 权限配置
    在AndroidManifest.xml中添加:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 本地文件读写权限(根据版本适配) -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    
  2. 平台特定代码示例(MAUI中用条件编译)

    #if ANDROID
    using Android.Net.Smb;
    using Android.Content;
    using Java.IO;
    
    public async Task UploadFileWithNativeSmb(Context context, string nasIp, string shareName, string username, string password, string localFilePath, string remoteFileName)
    {
        var smbManager = SmbManager.GetInstance(context);
        // 构建NAS设备地址
        var smbDevice = new SmbDevice($"smb://{nasIp}");
        // 创建认证信息
        var credential = new SmbCredential(username, password);
    
        // 连接共享文件夹
        var smbShare = await smbManager.ConnectAsync(smbDevice, shareName, credential);
    
        // 本地文件与远程文件路径
        var localFile = new File(localFilePath);
        var remoteFile = new SmbFile(smbShare.Uri.ToString() + "/" + remoteFileName);
    
        // 流传输文件
        using var inputStream = new FileInputStream(localFile);
        using var outputStream = smbManager.OpenOutputStream(remoteFile);
    
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = await inputStream.ReadAsync(buffer, 0, buffer.Length)) != -1)
        {
            await outputStream.WriteAsync(buffer, 0, bytesRead);
        }
    }
    #endif
    

额外注意事项

  • 确保Asustor NAS的SMB服务已开启:登录NAS管理后台,进入「服务」-「SMB」启用服务,并确认共享文件夹已给目标用户分配读写权限。
  • 测试时需保证手机与NAS处于同一局域网内。

内容的提问来源于stack exchange,提问作者eko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:21:07