用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"

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

相关推荐
MATLAB代码顾问3 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
工程师0074 小时前
C# 装箱、拆箱 底层原理
c#·装箱和拆箱
万粉变现经纪人5 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒5 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼5 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
小郑加油6 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦6 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp7 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy7 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode7 小时前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶