C#利用RAPI函数实现PC机与CE设备的文件传输
2013-05-23 14:18
176 查看
namespace Project1 { using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; //连接CE设备 public class RAPIInit { public void RapiInit() { int ret = CeRapiInit(); if (ret != 0) { // 连接失败,获取失败代码 int e = CeRapiGetError(); // 抛出异常 Marshal.ThrowExceptionForHR(ret); } // 连接成功 // To Do } [DllImport("rapi.dll", CharSet = CharSet.Unicode)] internal static extern int CeRapiGetError(); [DllImport("rapi.dll", CharSet = CharSet.Unicode)] internal static extern int CeRapiInit(); } public class RAPI { private const uint GENERIC_WRITE = 0x40000000; // 设置读写权限 private const uint GENERIC_READ = 0x80000000; //设置读权限 private const uint CREATE_ALWAYS = 2; // 创建新文件 private const short CREATE_NEWN = 1; // 创建新文件 private const short OPEN_EXISTING = 3; //打开已有的文件 private const short FILE_ATTRIBUTE_NORMAL = 0x80; // 设置文件属性 private const short INVALID_HANDLE_VALUE = -1; // 错误句柄 private String LocalFileName; private String RemoteFileName; IntPtr remoteFile = IntPtr.Zero; byte[] buffer = new byte[0x1000]; // 传输缓冲区定义为4k FileStream localFile; SafeFileHandle localFile1; int bytesread = 0; int byteswritten = 0; int filepos = 0; public RAPI(String LocalFileName, String RemoteFileName) { this.LocalFileName = LocalFileName; this.RemoteFileName = RemoteFileName; } //复制CE上的文件到PC机上 public void RapiFileFromCE() { //打开CE系统上的文件 remoteFile = CeCreateFile(RemoteFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // 检查文件是否打开成功 if ((int)remoteFile == INVALID_HANDLE_VALUE) { throw new Exception("Could not create remote file"); } // 创建PC上的文件 localFile1 = CreateFile(LocalFileName,GENERIC_WRITE, 0, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero); // 读取4K字节 do { if (Convert.ToBoolean(CeReadFile(remoteFile, buffer, buffer.Length, ref bytesread, 0))) { // 写缓冲区数据到远程设备文件 if (!Convert.ToBoolean(WriteFile(localFile1, buffer, bytesread, ref byteswritten, 0))) { // 检查是否成功,不成功关闭文件句柄,抛出异常 CeCloseHandle(remoteFile); throw new Exception("Could not write to remote file"); } } }while (Convert.ToBoolean(bytesread)); } //PC上的文件写到CE上 public void RapiFileToCE() { // 创建远程文件 remoteFile = CeCreateFile(RemoteFileName, GENERIC_WRITE, 0, 0, CREATE_NEWN, FILE_ATTRIBUTE_NORMAL, 0); // 检查文件是否创建成功 if ((int)remoteFile == INVALID_HANDLE_VALUE) { throw new Exception("Could not create remote file"); } // 打开本地文件 localFile = new FileStream(LocalFileName, FileMode.Open); // 读取4K字节 bytesread = localFile.Read(buffer, filepos, buffer.Length); while (bytesread > 0) { // 移动文件指针到已读取的位置 filepos += bytesread; // 写缓冲区数据到远程设备文件 if (!Convert.ToBoolean(CeWriteFile(remoteFile, buffer, bytesread, ref byteswritten, 0))) { // 检查是否成功,不成功关闭文件句柄,抛出异常 CeCloseHandle(remoteFile); throw new Exception("Could not write to remote file"); } try { // 重新填充本地缓冲区 bytesread = localFile.Read(buffer, 0, buffer.Length); } catch (Exception) { bytesread = 0; } } // 关闭本地文件 localFile.Close(); // 关闭远程文件 CeCloseHandle(remoteFile); } // 声明要引用的API [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern Boolean WriteFile(SafeFileHandle lpFileName, byte[] lpBuffer, int nNumberOfbytesToWrite, ref int lpNumberOfbytesWritten, int lpOverlapped); [DllImport("rapi.dll", CharSet = CharSet.Unicode)] internal static extern int CeCloseHandle(IntPtr hObject); [DllImport("rapi.dll", CharSet = CharSet.Unicode)] internal static extern int CeCopyFile( string lpExistingFileName, string lpNewFileName, Boolean bFailIfExists); [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 CeReadFile(IntPtr hFile, byte[] lpBuffer, int nNumberOfBytesToRead, ref int lpNumberOfBytesRead, int lpOverlapped); [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] internal static extern IntPtr CeCreateFile( string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); } //测试例子代码 class Class3 { public static void Main(String[] args) { String LocalFileName = @"c:\test2.txt";// @"c:\test1.txt"; // 本地计算机文件名 String RemoteFileName = @"\Program Files\CeCopyFile\test1.txt"; // 远程设备文件名 new RAPIInit().RapiInit(); //new RAPI().RapiFileToCE(); new RAPI(LocalFileName,RemoteFileName).RapiFileFromCE(); } } }
相关文章推荐
- 利用udev实现设备hotplug通知
- C#利用DataGridView实现数据的快速输入
- unity3d学习笔记(十八)--利用C#的代理和事件结合NGUI的按钮实现施放
- C#利用HttpWebRequest、HttpWebResponse调用12306接口,实现登录、查票、买票。
- C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩
- C#中利用正则表达式实现字符串搜索
- C#利用lambda实现委托事件的挂接
- 利用 C# 实现任务栏通知窗口
- C#和JAVA利用BASE64实现图片编码解码
- Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法
- C#中利用代理实现观察者设计模式详解
- 利用TWAIN-实现与图像输入设备的通讯
- 用C#实现HTTP协议下的多线程文件传输
- 利用c#面向对象实现对数据库的操作
- 利用C#实现分布式数据库查询
- 在C#中利用DirectX实现声音播放
- asp.net 利用Cookie实现免登陆(c#)
- C#利用DataGridView实现数据的快速输入
- C#实现利用泛型将DataSet转为Model的方法
- C#.NET利用ContextBoundObject和Attribute实现AOP技术--AOP事务实现例子