如何在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项目中编写通用代码即可。
安装NuGet包
在项目管理器中安装SharpSmbLib,或者在Package Manager Console执行:Install-Package SharpSmbLib核心代码示例
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); }权限配置
在Android项目的AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />如需读写本地存储文件,需额外添加对应存储权限(根据Android版本适配)。
方案二:使用Android原生SMB API(Android 12+)
如果只针对Android 12及以上版本开发,可使用系统原生SMB API,避免引入第三方库。
权限配置
在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" />平台特定代码示例(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
相关产品推荐
相关产品推荐

