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

C#使用DirectoryInfo.GetFiles()读取三星手机USB文件报错问题

解决C#读取三星MTP手机文件时的FileNotFoundException问题

我之前也碰到过一模一样的问题!核心原因是你代码里用的路径其实不是传统的文件系统路径——资源管理器里显示的SAMSUNG\Phone是MTP(媒体传输协议)设备的虚拟路径,.NET的DirectoryInfo、File这类IO类只识别本地磁盘、映射网络驱动器这种真实的文件系统路径,完全无法解析MTP设备的虚拟路径,所以才会抛出FileNotFoundException。

为什么资源管理器能访问但代码不行?

资源管理器是通过Windows内置的MTP驱动来识别并展示手机内容的,它把MTP设备的内容映射成了看起来像本地文件夹的虚拟结构,但这个结构并不存在于真实的文件系统中,自然无法被.NET的标准IO类读取。

可行的解决方案

这里给你两个实用的解决方向:

1. 使用MTP专用的库(推荐)

最方便的方式是用第三方封装好的MTP操作库,比如NuGet上的MediaDevices,它已经把复杂的Windows Portable Devices(WPD)API封装成了易用的.NET接口。

步骤如下:

  • 打开NuGet包管理器,安装MediaDevices包
  • 使用以下代码读取手机文件:
using MediaDevices;
using System;

class PhoneFileReader
{
    static void Main()
    {
        // 获取所有连接的MTP设备
        var connectedDevices = MediaDevice.GetDevices();
        
        foreach (var device in connectedDevices)
        {
            // 筛选出三星设备(根据实际设备名称调整)
            if (device.FriendlyName.Contains("SAMSUNG"))
            {
                device.Connect();
                
                // 定位到手机内的Phone目录(注意路径格式是MTP设备内的虚拟路径)
                var phoneDir = device.GetDirectoryInfo(@"\Phone");
                
                // 递归遍历所有文件
                foreach (var file in phoneDir.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    Console.WriteLine($"找到文件:{file.Name},路径:{file.FullName}");
                }
                
                device.Disconnect();
                break;
            }
        }
    }
}

2. 切换到USB大容量存储模式(仅部分老机型支持)

如果你的三星手机支持USB大容量存储模式,可以在连接电脑时选择这个模式,此时手机会被识别为一个本地磁盘(比如E:、F:盘),这时你就可以用原来的DirectoryInfo代码读取文件了。不过现在大部分新款三星手机已经取消了这个模式,所以这个方案的适用性有限。

额外注意事项

  • 确保手机连接电脑时选择的是**传输文件(MTP)**模式,而不是“仅充电”或“传输照片(PTP)”模式
  • 如果使用MediaDevices库遇到权限问题,需要确保你的程序有足够的权限访问外部设备

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:38