Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用USB和/或WPD将文件从Android设备传输到PC_C#_Android_C++_Wpd - Fatal编程技术网

C# 如何使用USB和/或WPD将文件从Android设备传输到PC

C# 如何使用USB和/或WPD将文件从Android设备传输到PC,c#,android,c++,wpd,C#,Android,C++,Wpd,我正在尝试通过电缆将android设备连接到(Windows7 64位)PC,然后通过编程方式从android到PC检索一些文件 (注意:我需要一个特定的设备,Moverio BT-200,我的驱动程序有问题;所以请不要建议使用adb;-)我知道这是简单快捷的方法,但不可行) 我发现我的设备可以看作是Windows便携式设备()。我在C#中找到了一些非常好的代码示例,这些示例使我能够。我还发现了C++中的一些代码,它确实如此。只要我连接一张SD卡或一个usb密钥(也就是说,只要我有一个Windo

我正在尝试通过电缆将android设备连接到(Windows7 64位)PC,然后通过编程方式从android到PC检索一些文件

(注意:我需要一个特定的设备,Moverio BT-200,我的驱动程序有问题;所以请不要建议使用adb;-)我知道这是简单快捷的方法,但不可行)

我发现我的设备可以看作是Windows便携式设备()。我在C#中找到了一些非常好的代码示例,这些示例使我能够。我还发现了C++中的一些代码,它确实如此。只要我连接一张SD卡或一个usb密钥(也就是说,只要我有一个Windows可以识别的设备,并且有一个字母作为正确的驱动器),并且我有一个当前文件的完整列表,以及它们的绝对路径,所有这些例子都像一个符咒。但是,如果我尝试连接android设备并列出内容,我会得到一些我不理解的东西:

embt2
SD Card
o15F9A
o15F9B
o15F9C
o15F9D
o15F9E
...etc
Internal Storage
o1
o2
o3
o4
o5
o6
oD1F
oD20
oD24
o7
o8
o1E78
o9
...etc
这怎么可能?浏览C#代码(上面的第二个链接),我发现在某些情况下,代码会创建几个GUID对象,每个对象都有一些稍微不同的参数:

// Identify the property to retrieve
var property = new _tagpropertykey();
property.fmtid = new Guid(0x26D4979A, 0xE643, 0x4626, 0x9E, 0x2B,
                                      0x73, 0x6D, 0xC0, 0xC9, 0x2F, 0xDC);
property.pid = 12;

[...]

// Get the name of the object
string name;
var property = new _tagpropertykey();
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC,
                                  0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
property.pid = 4;

[...]

// Get the type of the object
property = new _tagpropertykey();
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC,
                                  0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
property.pid = 7;

[...]

var folderType = new Guid(0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C,
                                  0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85);
var functionalType = new Guid(0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98,
                                      0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21);
但我无法理解这些十进制值是如何工作的。在线文档似乎很少。我用设备管理器找到了我的设备guid(
{eec5ad98-8080-425f-922a-dabf3de3f69a}
),但每次我试图用自己的guid替换其中一个guid时,都会遇到一个COMException

我找对地方了吗?我需要设置一些GUID还是其他什么


我把这个问题标注为C和C++,因为我在这两种语言中找到了一些代码示例,但是我愿意用任何语言(java,python,……)来解决这个问题。

所有奇怪的文件名是怎么回事?您发布的第一个列表中有许多条目,这些条目以
o
开头,后跟一个十六进制数字,它们是PTP/MTP唯一的项目标识符,允许您引用远程设备上的文件项目。这些是正常的,是PTP和MTP协议的一部分,它们是PTP和MTP协议中与完整项目枚举和文件传输系统一起提供的许多数据之一

如何处理所有的GUI和细微的变化?这基本上就是USB HID(硬件识别)协议的工作原理,特别是Microsoft如何实现它。GUI是Microsoft代码,链接到USB驱动程序中的HID路径,然后调用USB设备获取信息(获取或设置信息)。每个HID命令还使用PID(产品标识符)来寻址HID路径或命令中内存的特定位置,因此在HID命令中传递不同的PID会导致在USB设备上获取/设置不同的数据

让人有点悲伤和恐惧的是,微软如何将这种非常低级的交互暴露给高级工程师和程序。他们的文档并没有提供太多有用的背景信息,也没有解释这些东西是什么,意味着什么。如果您想要更可靠的示例代码和背景,我强烈建议您了解如何在C#/.Net中使用WPD,因为它们确实帮了我很大的忙。更多的好东西请看他的


另一条可能有用的建议是,您可以浏览整个PID范围,查看其中包含的信息类型。只要将你的窥视和戳入try/catch块,以防失败。我围绕Christophe Geer的代码构建了一个额外的小工具,该工具可以窥视PIDs 0-31中的所有HID GUI,并发现了许多额外的有用信息。

作为记录,我最终使用了一些可怕的黑客来解决我的问题。 因为我知道我要查找的文件的存储路径,所以我使用了Christophe Geer博客中的函数
EnumerateContent
,并进行了修改以检查当前文件夹是否具有我要查找的名称:

例如,如果我感兴趣的文件位于
Sd卡/path/to/directory/
中,那么我对代码进行了如下调整:不是调用方法
EnumerateContents
,而是调用方法
EnumerateContentsInTargetDirectory

private static void EnumerateContentsInTargetDirectory(ref IPortableDeviceContent content, PortableDeviceFolder parent)
{
    // Get the properties of the object
    IPortableDeviceProperties properties;
    content.Properties(out properties);

    // Enumerate the items contained by the current object
    IEnumPortableDeviceObjectIDs objectIds;
    content.EnumObjects(0, parent.Id, null, out objectIds);

    uint fetched = 0;
    do
    {
        string objectId;

        objectIds.Next(1, out objectId, ref fetched);
        if (fetched > 0)
        {
            var currentObject = WrapObject(properties, objectId);

            if (currentObject is PortableDeviceFolder)
            {
                if (currentObject.Name.Equals("SD Card") || currentObject.Name.Equals("path") || currentObject.Name.Equals("to"))
                {
                    parent.Files.Add(currentObject);
                    EnumerateContentsInTargetDirectory(ref content, (PortableDeviceFolder)currentObject);
                }
                else if (currentObject.Name.Equals("directory"))
                {
                    parent.Files.Add(currentObject);
                    // This is the same original method of Christophe Geer.
                    EnumerateContents(ref content, (PortableDeviceFolder)currentObject);
                }
            }
        }
    } while (fetched > 0);

}

我认为显示的代码无法编译,因为它重新声明了名称
属性。无论如何,它只是创建
Guid
对象。阅读Wikipedia中的GUI。@谢谢,这不是确切的代码:我只是复制粘贴在一起的代码块,这些代码块来自原始项目中的不同位置。阅读第二个链接以获得完整的解释。(是的,它会编译,因为这段代码实际上只是覆盖了同一个变量)。我真的不认为维基百科页面能解决我的问题。所有的GUID内容都是我的猜测,我不确定我的问题是否存在。*如果没有多个“var”,它将编译。我的错,你好,谢谢!你的回答并没有真正帮助我解决问题,但肯定包含了很多有趣的信息!(除了两个链接。您可能没有注意到,在我的第一个问题中,我已经自己链接了它们;-)。谢谢你抽出时间。我已经解决了一些可怕的黑客。承认这一点让我很难过,但整个系统似乎是微软方面的一个可怕的黑客。因此,任何能让它工作的东西都必然会成为一种黑客行为目前我正在努力寻找解决办法的最大问题是,Windows WPD和WIA似乎只支持USB 1.0速度,连接USB 3.0设备和电缆并不能提高速度=/