C#利用RAPI函数实现PC机与CE设备的文件传输

本文介绍了一个使用RAPI接口在CE设备和PC间传输文件的实现方式,包括连接CE设备、复制文件到PC机以及从PC机写入到CE设备的过程。通过使用RAPI.dll中的API函数,实现文件的高效传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
        }
    }
}

 

转载于:https://www.cnblogs.com/nbafeizi/archive/2013/05/23/3094824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值