/// <summary> /// Copies the specified file from the device. /// </summary> /// <param name="remoteFile"></param> /// <param name="localFile"></param> public static void CopyFromDevice(string remoteFile, string localFile) { var r = new Rapiinit(); r.cbsize = Marshal.SizeOf(r); CeRapiInitEx(ref r); try { var remoteFilePtr = CeCreateFile(remoteFile, GenericRead, 0, 0, OpenExisting, FileAttributeNormal, 0); if (remoteFilePtr.ToInt32() == InvalidHandleValue) { return; } var localFileStream = new FileStream(localFile, FileMode.Create, FileAccess.Write); var read = 0; const int size = 1024 * 4; var data = new byte[size]; CeReadFile(remoteFilePtr, data, size, ref read, 0); while (read > 0) { localFileStream.Write(data, 0, read); if (CeReadFile(remoteFilePtr, data, size, ref read, 0) != 0) { continue; } CeCloseHandle(remoteFilePtr); localFileStream.Close(); return; } CeCloseHandle(remoteFilePtr); localFileStream.Flush(); localFileStream.Close(); if (!File.Exists(localFile)) { throw new FileNotFoundException("The file was not copied to the desktop"); } } finally { CeRapiUninit(); } }
/// <summary> /// Copies the specified file into the device. /// </summary> /// <param name="localFile"></param> /// <param name="remoteFile"></param> public static void CopyToDevice(string localFile, string remoteFile) { var r = new Rapiinit(); r.cbsize = Marshal.SizeOf(r); CeRapiInitEx(ref r); try { var filePtr = CeCreateFile(remoteFile, GenericWrite, 0, 0, CreateAlways, FileAttributeNormal, 0); if (filePtr == new IntPtr(InvalidHandleValue)) { return; } using (var localFileStream = new FileStream(localFile, FileMode.Open, FileAccess.Read)) { var byteswritten = 0; var position = 0; var buffer = new byte[BufferSize]; var bytesread = localFileStream.Read(buffer, position, BufferSize); while (bytesread > 0) { position += bytesread; if (CeWriteFile(filePtr, buffer, bytesread, ref byteswritten, 0) == ErrorSuccess) { return; } try { bytesread = localFileStream.Read(buffer, 0, BufferSize); } catch { bytesread = 0; } } } } finally { CeRapiUninit(); } }
static extern void CeRapiInitEx(ref Rapiinit pRapiInit);