宜昌华友原料库管理软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
9.3 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace SiaSun.LMS.Common
{
/// <summary>
/// PDA设备操作类
/// </summary>
public class PDA_Device
{
RAPIInit inittrd = new RAPIInit();
/// <summary>
/// 连接PDA
/// </summary>
public string ConnectPDA()
{
try
{
inittrd.RapiUnInit();
inittrd.RapiInit();
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
/// <summary>
/// 断开连接
/// </summary>
public string DisConnectPDA()
{
try
{
int error = inittrd.RapiUnInit();
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
/// <summary>
/// 创建PDA文件
/// </summary>
public string DeletePDAFile(string PDA_FileName)
{
try
{
RAPI.CeDeleteFile(PDA_FileName);
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
/// <summary>
/// 从PDA拷贝文件到PC
/// </summary>
public string CopyFileFromPDA(string PC_FileName,string PDA_FileName)
{
try
{
////判断文件是否存在
//FileInfo flInfo = new FileInfo(PC_FileName);
//if (flInfo.Exists)
//{
// //删除现有文件
// flInfo.Delete();
//}
RAPI DownFilRapi = new RAPI(PC_FileName, PDA_FileName);
DownFilRapi.RapiFileFromCE();
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
/// <summary>
/// 从PC拷贝文件到PDA
/// </summary>
public string CopyFileToPDA(string PC_FileName, string PDA_FileName)
{
try
{
RAPI DownFilRapi = new RAPI(PC_FileName, PDA_FileName);
RAPI.CeDeleteFile(PDA_FileName);
DownFilRapi.RapiFileToCE();
}
catch (Exception ex)
{
return ex.Message;
}
return null;
}
}
//连接CE设备
public class RAPIInit
{
public int RapiInit()
{
int ret = CeRapiInit();
if (ret != 0)
{
// 连接失败,获取失败代码
ret = CeRapiGetError();
// 抛出异常
Marshal.ThrowExceptionForHR(ret);
}
return ret;
// 连接成功
// To Do
}
public int RapiUnInit()
{
return CeRapiUninit();
}
[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiGetError();
[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiInit();
[DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiUninit();
}
//初始化RAPI
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));
localFile1.Close();
}
//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)]
public static extern int CeDeleteFile(string DeviceFileName);
[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);
}
}