2017-03-05 29 views
8

使用WindowsForms技术,我试图通过USB将本地存储在硬盘(C:\)上的文件复制到存储在连接的智能手机设备上的文件夹。我必须使用哪个Win32函数将文件复制到智能手机文件夹?

文件夹“path”在资源管理器导航栏中使用友好名称表示为MyPCName\MyName\Card\Android,在Windows内部表示为::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&612ff8b&1&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{20002,SECZ9519043CHOHB01,31426543616}\{01A00139-011B-0124-3301-29011C013501}

我获得的“内部路径”通过使用COM Shell.BrowseForFolder方法然后检查返回的对象的FolderItem.Path属性。

然后获得路径后,我试用过CopyFileCopyFileEx Win32函数来复制该文件,但他们没有工作。他们似乎无法识别目录路径。

我使用的语法是这样的:

Dim dirPath As String = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&612ff8b&1&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{20002,SECZ9519043CHOHB01,31426543616}\{01A00139-011B-0124-3301-29011C013501}" 
NativeMethods.CopyFile("C:\MyFile.ext", dirPath & "\MyFile.ext", failIfExists:=True) 

在该代码中的CopyFile()函数返回Marshal.GetLastWin32Error()函数返回一个0x3 Win32错误代码。

我用的CopyFile/CopyFileEx定义是相同的Pinvoke.net网站上公布(C#版本):


如果用户可以复制该文件,只需将其从资源管理器实例拖到智能手机目录,那么我认为这显然可以通过programmaticall复制您只需找到并使用Windows自己从UI侧执行这种复制操作的相同Win32函数即可。那么我做错了什么?为什么CopyFile/CopyFileEx不能复制文件?我该如何复制它?

请注意,我正在寻找一种用C#或者VB.NET编写的解决方案,只需使用托管代码就可以解决问题,或者使用非托管代码P /调用Win32函数,除了像Shell一样使用COM库COM对象(提供了一个CopyHere()方法)。我想了解并了解如何使用Win32 API成员进行这种文件复制操作。

+0

当你在资源管理器中打开SD卡的文件夹,[右移点击](http://superuser.com/ q/582980/52365)一个文件并点击复制为路径,你会在剪贴板中获得什么样的路径? – GSerg

+0

@GSerg似乎CopyAsPath外壳扩展不适用于这种设备,或者至少对于这个特定的设备,上下文菜单中的“复制为路径”选项不会像正常情况下显示的那样显示驱动器),文件夹。感谢评论 – ElektroStudios

+1

那么,你也可以尝试[Procmon](https://technet.microsoft.com/en-us/sysinternals/processmonitor)。将筛选器设置为资源管理器进程,并查看它所调用的参数以及哪些参数。 – GSerg

回答

1

您正在寻找Windows便携设备API。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd388998(v=vs.85).aspx

编辑:我已经成功地使用这个API,在C#中使用COM互操作,读/在我的Android的Galaxy S3写入文件。

您也可以找到关于使用C#这个API在以下博客良好的信息:https://cgeers.wordpress.com/category/programming/wpd/

+0

感谢您的建议。我在.NET项目中引用了相关的WPD COM库,但实际上我不知道如何列出设备,选择所需的设备,并最终将文件复制到其中一个文件夹。此外,MSDN示例仅适用于C++ https://msdn.microsoft.com/en-us/library/windows/desktop/dd798115(v=vs.85).aspx以及C#中的现有示例,如CodePlex或GirHub是非常大的一般项目,帽子涵盖了更多的传输文件的东西,换句话说:对WPD中一个没有经验的用户来说,这是一个痛苦的分析。无论如何,我正在检查它,试图明白.. – ElektroStudios

+3

我不认为这个建议是正确的。操作系统应该(并且)能够在复制文件时将设备API抽象出来。 – GSerg

+0

请解释如何在“不正确”或“差”这个建议。要么你提供WPD-API的替代方案,要么对你自己保留这种非建设性的批评。 我们的研究得出结论说,没有其他方法可以做到这一点,但要使用提到的(非常笨重的)API。有一个强烈的迹象表明,即使是操作系统或资源管理器正在使用这个API,当使用这样的设备。 –

相关问题