一、任务描述
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
对象
cs
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:返回当前目录中的可枚举目录信息集合。
cs
//设置路径
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、 打开目标文件,并将内容下载下来
cs
/* 打开文件 */
//创建完整路径
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"
这里无论下载路径上是否事先创建相关文件夹和文件,系统都会自动创建给你