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
相关产品推荐
相关产品推荐

