如何通过USB线在C#.NET的WinForm与Xamarin.Forms间传输文件
文件传输解决方案
一、FolderBrowserDialog按钮禁用原因
Android设备通过USB连接PC后默认以MTP(媒体传输协议)挂载,这类目录不属于Windows标准文件系统路径,FolderBrowserDialog无法识别为可写入的本地目录,因此OK按钮会被禁用。
二、代码编写位置
核心传输逻辑写在Windows Form后端,因为需要直接操作PC本地文件和USB连接的设备;Xamarin.Forms Android端仅需做辅助处理(比如确保Downloads目录可访问、监听文件传输完成通知)。
三、可行实现方案
方案1:使用ADB命令(推荐,无额外依赖)
ADB是Android官方调试工具,支持直接向设备推送文件,无需手动选择目录:
- 确保PC已安装ADB工具,Android设备开启USB调试并授权PC连接。
- WinForm中实现传输逻辑:
private void btnTransfer_Click(object sender, EventArgs e) { string adbPath = @"C:\platform-tools\adb.exe"; // 替换为你的ADB实际路径 string localFilePath = txtFile1.Text; // PC端待传输文件路径 string deviceTargetPath = "/sdcard/Download/"; // Android内部存储Downloads目录 // 构建ADB推送命令 string arguments = $"push \"{localFilePath}\" \"{deviceTargetPath}\""; ProcessStartInfo startInfo = new ProcessStartInfo { FileName = adbPath, Arguments = arguments, UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; using (Process process = Process.Start(startInfo)) { string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (process.ExitCode == 0) { MessageBox.Show("文件传输成功!"); } else { MessageBox.Show($"传输失败:{error}"); } } }
- Xamarin端可按需监听Downloads目录变化,或通过广播接收传输完成通知(可选)。
方案2:使用MTP库直接访问设备
若不想依赖ADB,可借助第三方MTP库(如MtpLibrary)直接操作MTP存储:
- 安装NuGet包
MtpLibrary。 - WinForm中实现传输逻辑:
using MtpLibrary; private void btnTransfer_Click(object sender, EventArgs e) { MtpDevice device = MtpDevice.GetDevices().FirstOrDefault(); if (device == null) { MessageBox.Show("未找到连接的Android设备"); return; } device.Connect(); try { // 获取设备上的Downloads目录对象 var downloadsFolder = device.GetStorageObjects().FirstOrDefault(s => s.Name == "Download"); if (downloadsFolder == null) { MessageBox.Show("未找到Downloads目录"); return; } string localFilePath = txtFile1.Text; // 推送文件至Downloads目录 device.SendFile(localFilePath, downloadsFolder.ObjectId); MessageBox.Show("文件传输成功!"); } catch (Exception ex) { MessageBox.Show($"传输失败:{ex.Message}"); } finally { device.Disconnect(); } }
四、注意事项
- 确保Android设备USB连接模式设置为文件传输(MTP)(方案2)或USB调试(方案1)。
- Android 10及以上版本,访问内部存储Downloads目录无需特殊权限;Android 13+可使用
READ_MEDIA_IMAGES等细分权限替代旧版存储权限。 - 使用ADB时,首次连接设备需在Android端授权PC进行调试。
内容的提问来源于stack exchange,提问作者DANIELKT
相关产品推荐
相关产品推荐

