用C#的MediaDevices程序集打开MTP设备(用usb线连接的手机)的文件夹

一、任务描述

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"

这里无论下载路径上是否事先创建相关文件夹和文件,系统都会自动创建给你

相关推荐
MessiGo26 分钟前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
大霞上仙30 分钟前
nonlocal 与global关键字
开发语言·python
galaxy_strive35 分钟前
绘制饼图详细过程
开发语言·c++·qt
黑客老李1 小时前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
开开心心就好2 小时前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
特立独行的猫a2 小时前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
勤奋的知更鸟2 小时前
Java编程之原型模式
java·开发语言·原型模式
珂朵莉MM2 小时前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
香蕉炒肉2 小时前
Java优化:双重for循环
java·开发语言
傍晚冰川3 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习