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

如何通过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官方调试工具,支持直接向设备推送文件,无需手动选择目录:

  1. 确保PC已安装ADB工具,Android设备开启USB调试并授权PC连接。
  2. 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}");
        }
    }
}
  1. Xamarin端可按需监听Downloads目录变化,或通过广播接收传输完成通知(可选)。

方案2:使用MTP库直接访问设备

若不想依赖ADB,可借助第三方MTP库(如MtpLibrary)直接操作MTP存储:

  1. 安装NuGet包MtpLibrary。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:50:27