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

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

相关推荐
在繁华处1 小时前
Java从零到熟练(九):并发编程基础
java·开发语言
木头程序员1 小时前
SSM框架学习笔记
java·开发语言·mysql·spring·maven
一起逃去看海吧1 小时前
dify-03
java·linux·开发语言
xiaoshuaishuai82 小时前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#
Xin_ye100862 小时前
C# 零基础到精通教程 - 第十八章:部署与发布——让应用上线
开发语言·c#
思麟呀3 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
码不停蹄的玄黓3 小时前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的3 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪3 小时前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
_童年的回忆_4 小时前
【php】在linux下PHP安装amqp扩展
linux·开发语言·php