一、任务描述
1、可以访问MTP设备的桌面程序。
MTP设备:支持媒体传输协议(MTP)的设备,MTP简单来说就是一种PC与其他设备相连的一种协议,智能手机、平板电脑、数码相机等可以通过 USB 连接到电脑,并通过 MTP 协议传输媒体文件。点开我的电脑,如图所示的“PDT-90P”的图标就是MTP设备,拿手机和电脑相连后选择连接模式为“传输文件”,使用的就是MTP协议。
可以访问MTP设备的桌面程序 :C#广泛应用于开发 Windows 桌面应用程序。桌面程序通过MTP协议访问MTP设备可以方便进行媒体管理、设备交互、多设备互通、及其他自定义功能,提升用户体验。
2、MediaDevices程序集
MediaDevices 是一个开源程序集,它允许 .NET 开发者访问和操作 MTP(媒体传输协议)设备的内容。MediaDevices 程序集通常用于在电脑和 MTP 设备之间传输文件,而无需为每个设备安装特定的驱动程序。
3、任务目标
1、设计一个C#的类的方法,调用该方法即可访问某个MTP设备的相应文件夹。
2、设计一个C#程序,要求:运行程序时打开某一个MTP设备相应文件夹(内部存储设备\SysSetting)下的一个文件(teste.txt),并将其中的内容
二、编程
假设我们使用的是VS2022进行C#开发
1、为项目调用MediaDevices程序集
点击项目——>管理nuget程序包——>
浏览——>搜索mediadevices——>安装(因为已经安装了,所以目前是卸载。)
等下边的输出框弹出:包已添加到XXX说明已经安装并配置完毕了
2、调用命名空间
using MediaDevices;
3、连接到我们需要的设备:
MediaDevice类
MediaDevice类是mediadevices程序集的主要类之一,设备类,表示一个便携式设备。我们用到的主要属性包括:
Description:设备简介、一般是设备的类型
FriendlyName:设备名称、可以通过重命名更改
Manufacturer:设备的制造商名称
DeviceId:设备标识符(id)
Model:设备型号
IsConnected:设备是否已连接
用到的主要方法包括:
GetDevices():遍历设备目录;返回值为一组便携式设备对象组成列表
Connect():连接方法,连接上该对象的设备
GetRootDirectory():这个方法会返回一个代表设备根目录的
MediaDirectoryInfo
对象
string deviceFriendlyName = "PDT-90P";// 获取所有连接的设备var devices = MediaDevice.GetDevices();// 找到并连接到特定的设备var device = devices.FirstOrDefault(d => d.Description == deviceFriendlyName);device.Connect();
var device = devices.FirstOrDefault(d => d.Description == deviceFriendlyName); 遍历devices列表的所有元素,将其中Description = deviceFriendlyName(一个局部变量变量)的第一个元素作为返回值返回。
4、跳转至相应目录
MediaDirectoryInfo类
MTP 设备上的目录类(你也可以理解为文件夹类),提供了用于访问和操作 MTP 设备上文件夹和目录的各种方法和属性。
用到的主要属性包括
FullName:存储当前目录
主要方法包括:
EnumerateDirectories:返回当前目录中的可枚举目录信息集合。
//设置路径string folderPath = @"内部存储设备\SysSetting";//创建目录对象MediaDirectoryInfo currentFolder = device.GetRootDirectory();//拆分路径、分步进入string[] pathParts = folderPath.Split('\\');foreach (string part in pathParts){if (!string.IsNullOrEmpty(part)){currentFolder = currentFolder.EnumerateDirectories().FirstOrDefault(dir => dir.Name.Equals(part, StringComparison.OrdinalIgnoreCase));if (currentFolder == null){throw new DirectoryNotFoundException($"Folder '{part}' not found.");}}}
currentFolder = currentFolder.EnumerateDirectories().FirstOrDefault(dir => dir.Name.Equals(part, StringComparison.OrdinalIgnoreCase)); 是一套组合拳,其目的是遍历当前目录的子目录并把子目录中名称和“part”一样的文件夹返回,也就是找到对应的文件夹并点进去。
可以用一下代码进行检验成果
//返回当前目录
Console.WriteLine(currentFolder.FullName);
//在当前目录下建立一个名叫xiaoyu的文件夹
currentFolder.CreateSubdirectory("xiaoyu");
至此我们的任务1就已经完成了,接下来是任务二的部分
5、 打开目标文件,并将内容下载下来
/* 打开文件 *///创建完整路径string fileName = "texte.txt";string pcfolderPath = @"G:\eastIC_sdk\数据库\";string filePath = Path.Combine(folderPath, fileName); //设备端的路径string pcfilePath = Path.Combine(pcfolderPath, fileName); //pc端的路径Stream fileStream = File.Create(pcfilePath); //创建流对象device.DownloadFile(filePath, fileStream); //下载fileStream.Flush(); //写入fileStream.Close(); //关闭流device.Disconnect();
目标设备路径为:"内部存储设备\\SysSetting\\texte.txt"
下载路径为:"G:\\eastIC_sdk\\数据库\\texte.txt"
这里无论下载路径上是否事先创建相关文件夹和文件,系统都会自动创建给你