使用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属性。
然后获得路径后,我试用过CopyFile和CopyFileEx 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#版本):
- http://www.pinvoke.net/default.aspx/kernel32/CopyFile.html
- http://www.pinvoke.net/default.aspx/kernel32.copyfileex
如果用户可以复制该文件,只需将其从资源管理器实例拖到智能手机目录,那么我认为这显然可以通过programmaticall复制您只需找到并使用Windows自己从UI侧执行这种复制操作的相同Win32函数即可。那么我做错了什么?为什么CopyFile/CopyFileEx不能复制文件?我该如何复制它?
请注意,我正在寻找一种用C#或者VB.NET编写的解决方案,只需使用托管代码就可以解决问题,或者使用非托管代码P /调用Win32函数,除了像Shell一样使用COM库COM对象(提供了一个CopyHere()
方法)。我想了解并了解如何使用Win32 API成员进行这种文件复制操作。
当你在资源管理器中打开SD卡的文件夹,[右移点击](http://superuser.com/ q/582980/52365)一个文件并点击复制为路径,你会在剪贴板中获得什么样的路径? – GSerg
@GSerg似乎CopyAsPath外壳扩展不适用于这种设备,或者至少对于这个特定的设备,上下文菜单中的“复制为路径”选项不会像正常情况下显示的那样显示驱动器),文件夹。感谢评论 – ElektroStudios
那么,你也可以尝试[Procmon](https://technet.microsoft.com/en-us/sysinternals/processmonitor)。将筛选器设置为资源管理器进程,并查看它所调用的参数以及哪些参数。 – GSerg