我必须使用哪个Win32功能将文件复制到智能手机文件夹?

Ele*_*ios 8 .net c# vb.net winapi file

使用WindowsForms技术,我试图通过USB将本地存储在硬盘驱动器(C:\)上的文件复制到存储在连接的智能手机设备上的文件夹中.

文件夹"path"使用友好名称表示,如MyPCName\MyName\Card\Android在Explorer导航栏中,以及::{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}在Windows内部.

我通过使用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)
Run Code Online (Sandbox Code Playgroud)

在该代码中,CopyFile()函数返回False,Marshal.GetLastWin32Error()函数返回0x3 Win32错误代码.

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


如果用户只需将文件从资源管理器实例拖到智能手机目录即可复制文件,那么我认为很明显,这可以通过编程方式再现,只需找到并使用Windows自身执行该类复制操作的相同Win32函数从UI方面.那我做错了什么?为什么CopyFile/CopyFileEx不能复制文件?我怎么能复制它?

请注意,我正在寻找用C#或VB.NET编写的解决方案,只需使用托管代码或使用非托管代码P /调用Win32函数即可解决,除了使用Shell库对象等COM库(即提供了一种CopyHere()方法).我想学习并了解如何使用Win32 API成员执行此类文件复制操作.

小智 1

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

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

编辑:我已成功使用此 API(使用 C# 中的 COM Interop)在我的 Android Galaxy S3 上读取/写入文件。

您还可以在以下博客中找到有关在 C# 中使用此 API 的详细信息: https: //github.com/geersch/WPD

  • 我认为这个建议不正确。操作系统应该(并且确实)能够在复制文件时抽象出设备 API。 (3认同)
  • 请解释一下这个建议是如何“不正确”或“差”的。要么您提供 WPD-API 的替代方案,要么您自己保留这种非建设性的批评。我们的研究得出的结论是,除了使用提到的(非常笨重的)API,实际上没有其他方法可以做到这一点。有强烈的迹象表明,在使用此类设备时,甚至操作系统或资源管理器也正在使用此 API。 (2认同)