Write Files to WPD device via MTP C#/VB.net
Question
I would like to write an application that will copy MP3 files to a SanDisk Sansa M240. The SanDisk doesn't have a drive letter and uses MTP for file transfer. I stumbled through the sample of connecting to the device at : http://blogs.msdn.com/dimeby8/archive/2006/09/27/774259.aspx
but once connected, I can't figure out how to actually copy files / create folders on the device.
I am very surprised that there aren't any .Net wrappers for this COM library.
Solution
It looks like dimeby8 posted some code that handles data transfers. Check other posts in his blog, especially:
Sending MTP commands through WPD part 1
OTHER TIPS
To transfer files through MTP with c#:
Download this NuGet package: PortableDevices
Add references to these 4 COM libraries:
- PortableDeviceClassExtension
- PortableDeviceConnectApi
- PortableDeviceTypes
- PortableDeviceApi
Take the dll's under
obj\Debug
and put them intobin\Debug
:- Interop.PortableDeviceClassExtension.dll
- Interop.PortableDeviceConnectApiLib.dll
- Interop.PortableDeviceTypesLib.dll
- Interop.PortableDeviceApiLib.dll
Now you can use the following function to list all devices, although FriendlyName
does not seem to be working (it returns an empty string):
private IDictionary<string, string> GetDeviceIds()
{
var deviceIds = new Dictionary<string, string>();
var devices = new PortableDeviceCollection();
devices.Refresh();
foreach (var device in devices)
{
device.Connect();
deviceIds.Add(device.FriendlyName, device.DeviceId);
Console.WriteLine(@"DeviceId: {0}, FriendlyName: {1}", device.DeviceId, device.FriendlyName);
device.Disconnect();
}
return deviceIds;
}
The next step is getting the contents from the device, which is done like so:
var contents = device.GetContents();