您的位置:首页 > 编程语言 > C#

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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: