First, we'll need our P/Invokes to rapi.dll
[DllImport("rapi.dll")]
static extern int CeRapiInit();
[DllImport("rapi.dll")]
static extern int CeRapiUninit();
[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
static extern IntPtr CeCreateFile(
string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeWriteFile(
IntPtr hFile, byte[] lpBuffer, int nNumberOfbytesToWrite,ref int lpNumberOfbytesWritten,
int lpOverlapped);[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeSetFileTime(
IntPtr hFile,ref long lpCreationTime,
ref long lpLastAccessTime,
ref long lpLastWriteTime);
const int BUFFER_SIZE = 1024 * 5; // 5k transfer buffer
const int CREATE_ALWAYS = 2;
const int ERROR_SUCCESS = 0;
const int FILE_ATTRIBUTE_NORMAL = 0x80;
const uint GENERIC_WRITE = 0x40000000;
const int INVALID_HANDLE_VALUE = -1;
Now let's wrap all those in a method called CopyToDevice(string localFile, string remoteFile). The localFile is the file located on the desktop and the remoteFile is the destination filename on the device.
void CopyToDevice(string localFile, string remoteFile)
{ var rapi = CeRapiInit() == ERROR_SUCCESS; if (!rapi) return; try { var filePtr = CeCreateFile(remoteFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if (filePtr == new IntPtr(INVALID_HANDLE_VALUE))
return;using (var localFileStream = new FileStream(localFile, FileMode.Open, FileAccess.Read))
{ var byteswritten = 0; var position = 0;var buffer = new byte[BUFFER_SIZE];
var bytesread = localFileStream.Read(buffer, position, BUFFER_SIZE); while (bytesread > 0) {position += bytesread;
if (CeWriteFile(filePtr, buffer, bytesread, ref byteswritten, 0) == ERROR_SUCCESS)
return; try {bytesread = localFileStream.Read(buffer, 0, BUFFER_SIZE);
}
catch {bytesread = 0;
}
}
}
}
finally {CeRapiUninit();
}
}
To use the code above you will have to know the full path of the file on the desktop.
I hope you found this useful.
3 comments:
Thanks, this article is very helpful for me.
Thanks, It is very helpful for me.
Thanks a lot! Very useful code!
Post a Comment