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

如何在.NET 4.5.2 WinForms程序中访问安卓手机外置存储卡DCIM文件夹

访问安卓MTP设备外置存储卡的DCIM文件夹(.NET 4.5.2 WinForms)

你看到的Username@MachineName\Galaxy Phone Model\Card\DCIM是MTP设备的虚拟命名空间路径,并非传统本地文件系统路径,无法直接用System.IO类访问。下面提供无需第三方库的实现方案,依赖Windows原生的Shell COM组件:

实现步骤

1. 添加Shell32 COM引用

在WinForms项目中:

  • 右键项目 → 选择「添加引用」
  • 切换到「COM」标签页,找到并勾选 Microsoft Shell Controls And Automation(对应Shell32.dll)
  • 点击确定完成引用添加

2. 编写代码遍历MTP设备路径

通过Shell命名空间定位到目标DCIM文件夹,可遍历或操作其中的文件:

using Shell32;
using System;
using System.Windows.Forms;

public partial class YourForm : Form
{
    public YourForm()
    {
        InitializeComponent();
        NavigateToAndroidDcim();
    }

    private void NavigateToAndroidDcim()
    {
        var shell = new Shell();
        // 访问桌面命名空间(所有可访问设备/文件夹的根入口)
        var desktopFolder = shell.NameSpace(0x0000); // CSIDL_DESKTOP的数值常量

        // 遍历桌面项,匹配你的Galaxy设备名称
        foreach (FolderItem item in desktopFolder.Items())
        {
            // 替换为你实际的设备名称,可根据需求调整匹配逻辑(比如包含"Galaxy"关键词)
            if (item.Name.Equals("Galaxy Phone Model", StringComparison.OrdinalIgnoreCase))
            {
                var deviceFolder = item.GetFolder();
                if (deviceFolder == null) continue;

                // 定位到外置存储卡(Card)
                var cardItem = deviceFolder.ParseName("Card");
                if (cardItem == null || !cardItem.IsFolder) continue;

                var cardFolder = cardItem.GetFolder();
                // 定位到DCIM文件夹
                var dcimItem = cardFolder.ParseName("DCIM");
                if (dcimItem == null || !dcimItem.IsFolder) continue;

                var dcimFolder = dcimItem.GetFolder();
                // 遍历DCIM文件夹内的文件/子文件夹
                foreach (FolderItem fileItem in dcimFolder.Items())
                {
                    Console.WriteLine($"找到:{fileItem.Name}");
                    
                    // 示例:复制文件到本地文件夹
                    // var localFolder = shell.NameSpace(@"C:\YourLocalPath");
                    // localFolder.CopyHere(fileItem);
                }
                break;
            }
        }
    }
}

关键注意事项

  • 设备名称匹配:代码中"Galaxy Phone Model"需要替换为你资源管理器中显示的实际设备名称,也可以改成模糊匹配(比如item.Name.Contains("Galaxy"))提升兼容性
  • 异步操作提醒:CopyHere方法是异步执行的,如果需要等待复制完成,需自行实现等待逻辑(比如定期检查目标文件夹的文件状态)
  • 权限问题:确保应用有足够的权限访问MTP设备,Windows 10/11可能会弹出授权提示,需用户确认
  • COM对象释放:生产环境中建议使用try-finally包裹Shell对象,确保资源正确释放:
    Shell shell = null;
    try
    {
        shell = new Shell();
        // 执行操作
    }
    finally
    {
        if (shell != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(shell);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:06:52