Es un tema complicado, apenas existe información de como usar la API de WPD que no sea para C/C++, incluyendo los samples oficiales en la referencia de la MSDN. Y aparte de eso, yo nunca he intentado hacer este tipo de cosas, bueno, si, una vez, pero más que por necesidad era por curiosidad, para aprender algo nuevo, pero me di en las narices con el follón de implementar los miembros de WPD y me desanimé xD:
https://stackoverflow.com/questions/42606459/which-win32-function-must-i-use-to-copy-a-file-to-a-smartphone-folder
Si buscas la opción más eficiente y sofisticada, pero al mismo tiempo la más compleja, entonces debes intentar usar la API de WPD. El compañero ya te pasó un enlace a una implementación en C# que a simple vista parece funcional, pero notarás que los enlaces del blog de ese programador están caidos, así que te tendrás que descargar el código fuente modificado que publicó el usuario @
Plutonix en su respuesta en
StackOverflow:
https://www.dropbox.com/s/8hfctmxsy0j75ft/Windows%20Portable%20Devices.zip?dl=0 o bien el código fuente original subido GitHub:
https://github.com/geersch/WPDSi buscas una solución más llevadera, que sea más abstracta y sencillo pero practicamente igual de eficiente, y
solo en caso de que tu dispositivo sea Android, entonces te recomiendo utilizar la librería
AndroidLib:
https://github.com/regaw-leinad/AndroidLib/releasesEs una librería sencilla de usar y bien documenttada, con algunos ejemplos básicos online. En su día la utilicé para leer información del dispositivo y poco más.
He estado analizando un poco el código fuente y, para copiar directorios y archivos (a modo de backup), presuntamente deberías poder usar los métodos "
PullDirectory()" y "
PullFile()" que están expuestos en la clase
AndroidController.Device:
https://github.com/regaw-leinad/AndroidLib/blob/master/AndroidLib/Classes/AndroidController/Device.csSi quieres algo todavía más sencillo, sin necesidad de recurrir a la API WPD, entonces simplemente puedes recurrir a los objetos COM de la Shell de Windows para acceder al directorio y copiarlo usando el método
Folder.CopyHere():
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspxSin embargo, esta opción es la más engorrosa y también limitada, puesto que no permite forma alguna de poder enumerar los dispositivos conectados de forma automatizada, tendrás que conocer de antemano la ruta "interna" del directorio del dispositivo conectado (algo similar a esto:
::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&612ff8b&1&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\), o como ya explico en la pregunta que formulé en
StackOverflow, puedes obtenerlo usando el método
Shell.BrowseForFolder:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb774065(v=vs.85).aspx el cual abrirá un diálogo de directorios para seleccionar tu dispositivo, y entonces en el objeto devuelto de tipo
FolderItem puedes obtener la ruta interna del directorio del dispositivo seleccionado comprobando el valor de la propiedad
FolderItem.Path:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787844(v=vs.85).aspxNo creo que pueda ayudarte más al respecto.
¡Saludos!