是否有可用于VB.net的库可以让我轻松访问MTP设备?我希望能够找到连接的设备,列出它们的内容并将文件复制到它们之间。
到目前为止我所看到的一切(无论是在Stack Overflow,在Microsoft网站上还是在简单的Google搜索中)都是使用C ++,C#或其他不是VB.net的语言。 Microsoft文档完全超出了我的想法。
因此,除非我打算学习一门新语言,否则它都不是首发。
我确实发现MTPSharp给了我希望。然而,没有文档,它似乎没有完全实现,我做某些事情的尝试返回一个例外,作者告诉我,它是针对我不应该使用的旧API编写的并且无法帮助我解决我的问题。
对于想要使用VB.net的人真的没有希望吗?
答案 0 :(得分:4)
注意:这是来自一系列博客的 Christophe Geers 的作品,可以是found here
我主要添加了一些函数,VB控制台测试,并将其转换为Class Lib。我在代码中调整了一些内容以简化它,但它们不值得进一步提及。
文档:
学习 Mr Geers' blog。
Visual Studio的IntelliSense在识别可用的属性和方法方面也很有价值。
<强>买者强>
我的便携式设备很少(而且找不到便携设备),所以测试相当有限。
文件和文件夹
此上下文中的术语File
和Folder
可能会产生误导。
正如文章明确指出的那样,PortableDeviceObject
和PortableDeviceFile
都有PortableDeviceFolder
类型(类)。 PortableDeviceObject
有一个名为Files
的属性集合,但该集合实际上包含PortableDeviceObject
个。该集合中的任何一个项目实际上可能是另一个文件夹。
我也开始实现Folders集合,然后弄清楚原因是什么。由于文件夹可以包含子文件夹,因此将文件链接到子文件夹到文件夹到PortableDevice会更加困惑和有问题。所以,我离开了。
这意味着必须对Files
集合中的每个项目进行测试,以确定它是真的File
还是Folder
。这通常可以通过以下两种方式之一完成:
' 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
为了使稍微更简单,更面向对象,我向IsFile
添加了IsFolder
和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先生original source
WPD的Another C# Project可能很有用
MSDN Windows Portable Devices documentation了解更多信息,以便日后准备好制作mod。
VB控制台应用程序(只是翻译)显示了如何使用某些功能。研究博客详情。
代码很长,很大程度上会复制Geers先生的博客,而且我不愿意发布不属于我的代码。此外,如果您无法将其编译为DLL,那么C#代码显然对您没什么好处。那么,为了回答提出的问题,是否有可用于VB.net的库,这使我可以轻松访问MTP设备?:
是。修改后的源代码,项目文件(VS2012),新的VB控制台测试应用和二进制文件(PortableDevices.dll
)可以是downloaded from DropBox。 bin / compile文件夹包括Build for AnyCPU / Release和x86 / Release
Interop.*
DLL保存在PortableDevice.DLL
这些文件夹中。例如,将它们与DLL一起复制到工具目录中。我不确定他为什么这样做。PortableDevice.DLL
的引用。当然,使用项目源文件,您可以加载它并重新编译为您想要的任何格式。 VS以与在VB中相同的方式编译C#项目。
适用于我的机器 TM
再次,要清楚,这不是我的工作。我主要把它编译成DLL。
答案 1 :(得分:1)
(这应该是对this answer的评论,但我没有足够的声誉来添加评论)
@理查德说:
当我运行C#代码时,我在第107行收到一条错误消息this._device.Content(out content); “对象引用未设置为对象的实例。”。
添加行:
this.Connect();
第107行之前为我解决了这个问题。
答案 2 :(得分:1)
此MediaDevices裸包应该适合您。
来自包装说明:
与智能手机,平板电脑等MTP / WPD设备进行通信的API 和相机。包括文档。
(GitHub link)。
要打开设备并在其上写入文件,请执行以下操作:
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();
}