3

是否有任何可用于 VB.net 的库可以让我轻松访问 MTP 设备?我希望能够找出连接了哪些设备,列出它们的内容并在它们之间复制文件。

到目前为止,我所看到的所有内容(无论是在 Stack Overflow、Microsoft 网站上还是通过简单的 Google 搜索)都是用 C++、C# 或其他一些不是 VB.net 的语言编写的。Microsoft 文档完全超出了我的想象。

结果,除非我打算学习一门新语言,否则这一切都是徒劳的。

我确实找到了给我希望的MTPSharp 。但是没有文档,它似乎没有完全实现,我做某些事情的尝试返回一个异常,作者告诉我它是针对我不应该使用的旧 API 编写的,无法帮助我我的问题。

想使用VB.net的人真的没有希望吗?

4

3 回答 3

7

一个窗口便携设备类库

注意:这是Christophe Geers的作品,来自一系列博客,可在此处找到

主要是加了几个函数,一个VB控制台测试,转成Class Lib。我在代码中调整了一些东西以简化它,但它们不值得一提。

文档:

研究 Geers 先生的博客

Visual Studio 的 IntelliSense 在识别可用的属性和方法方面也很有价值。

重要笔记

警告

我的便携式设备很少(而且找不到),所以测试相当有限。

文件和文件夹

在这种情况下,术语FileFolder可能具有误导性。

正如文章所阐明的,有一个PortableDeviceObject类型(类),两者都PortableDeviceFile继承PortableDeviceFolder自。 PortableDeviceObject有一个名为 的属性集合Files,但该集合实际上包含PortableDeviceObjects。该集合中的任何一项实际上都可能是另一个文件夹。

我也开始实现一个文件夹集合,然后弄清楚为什么会这样。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹到文件夹到 PortableDevice 会更加混乱和成问题。所以,我离开了它。

这意味着Files必须测试集合中的每个项目以查看它是否真的是 aFile或 aFolder。这通常可以通过以下两种方式之一完成:

' using VB operator
If TypeOf item Is PortableDeviceFolder Then
    Console.Beep()
End If

' using NET Type method
If item.GetType Is GetType(PortableDeviceFolder) Then
    Console.Beep()
End If

为了让事情变得简单和更面向对象,我添加了一个IsFileandIsFolder函数,PortableDeviceObject它允许:

If item.IsFolder Then
   DisplayFolderContents(dev, CType(item, PortableDeviceFolder))
End If

还有一个返回ItemType枚举值的方法(还有一个可能有用的静态版本):

' using GetItemType
If item.GetItemType = PortableDeviceObject.ItemTypes.File Then
    Console.Beep()
End If

资源

Geers 先生的原始资料

另一个可能有用的 WPD 的C# 项目

当您准备好稍后制作模组时,MSDN Windows Portable Devices 文档可获取更多信息。

一个 VB 控制台应用程序(只是一个翻译)展示了如何使用其中的一些功能。研究博客的详细信息。

代码很长,会在很大程度上复制 Geers 先生的博客,而且我不愿意发布不是我的代码。此外,如果您不能将 C# 代码编译为 DLL,那么显然对您没有什么好处。那么,要回答提出的问题,是否有任何可用于 VB.net 的库可以让我轻松访问 MTP 设备?

是的。 修改后的源代码、项目文件 (VS2012)、新的 VB 控制台测试应用程序和二进制文件 ( PortableDevices.dll) 可以从 DropBox 下载。bin/compile 文件夹包括适用于 AnyCPU/Release 和 x86/Release 的 Builds

  • 认为您会希望将Interop.*位于这些文件夹中的 DLL 与PortableDevice.DLL. 例如,将它们与 DLL 一起复制到您的工具目录中。我不知道他为什么那样做。
  • 要在项目中使用新的 Class Lib,您显然需要添加对您全新的PortableDevice.DLL.

当然,您可以使用项目源文件加载它并重新编译为您想要的任何格式。VS 编译 C# 项目的方式与在 VB 中相同。

在此处输入图像描述

适用于我的机器TM

再次声明,这不是我的工作。我主要是编译成DLL。

于 2014-10-30T18:06:05.510 回答
1

(这应该是对此答案的评论,但我没有足够的声誉来添加评论)

@Richard 说:

当我运行 C# 代码时,我在第 107 行遇到错误 this._device.Content(out content); “你调用的对象是空的。”。

添加行:

this.Connect();

在第 107 行为我解决了这个问题之前。

于 2020-01-25T19:36:18.843 回答
1

这个MediaDevices nuget 包应该适合你。

从包装描述:

用于与智能手机、平板电脑和相机等 MTP/WPD 设备通信的 API。包括文档。

GitHub 链接)。

要打开设备并在其上写入文件:

var devices = MediaDevice.GetDevices();
using (var device = devices.First(d => d.FriendlyName == "My Cell Phone"))
{
  device.Connect();

  device.CreateDirectory(@"\Phone\Documents\Temp");

  using(FileStream stream = File.OpenRead(@"C:/Temp/Test.txt"))
  {
    device.UploadFile(stream, @"\Phone\Documents\Temp\Test.txt");
  }
  device.Disconnect();
}
于 2020-01-25T22:20:38.887 回答