RAPI库由一组函数组成,这些函数可用于通过桌面应用程序管理设备,包括设备的目录文件、设备的注册表和系统信息。

RAPI提供了一组文件管理方法

CeCopyFile:复制文件

CeCreateDirectory:创建目录

CeCreateFile:创建,打开文件、管道、通讯资源、磁盘设备或者控制台。返回一个句柄用来访问对象。

CeDeleteFile:删除文件

CeFindAllFiles:从指定的Windows CE目录中获取所有文件和目录的信息,并且复制到一个包含CE_FIND_DATA结构的数组中

CeFindFirstFile:在目录中查找匹配的给定文件名的一个文件

CeFindClose:关闭指定的查找句柄,CeFindFirstFile和CeFindNextFile函数用这个句柄查找文件

CeFindNextFile:从上一次访问的CeFindFirstFile继续查找文件

CeGetFileAttributes:返回指定文件和目录的属性

CeGetFileSize:获取指定文件的字节大小

CeGetFileTime:获取文件创建日期时间,最后访问日期时间和最后修改日期时间

CeMoveFile:移动(重命名)一个文件或目录

CeReadFile:从文件指针处读取文件

CeWriteFile:从文件指针处写入文件数据

任何RAPI操作都需要首先初始化和设备的连接

CeRapiInit():同步初始化设备

CeRapiInitEx():异步初始化设备,并返回一个事件句柄

操作完毕后在合适的时候断开RAPI连接

CeRapiUninit(): 断开或停止设备连接

下面是复制文件到PDA的一个例子:

        private const uint GENERIC_WRITE = 0x40000000;//设置读写权限
private const short CREATE_NEW = ;//创建新文件
private const short FILE_ATTRIBUTE_NORMAL = 0x80;//设置文件属性
private const short INVALID_HANDLE_VALUE = -;//错误句柄 private const int TimeOut = ;//异步连接设备超时时间2秒 private void btnCopyFileToPDA_Click(object sender, EventArgs e)
{
//1、初始化设备连接 ///---同步连接失败---
//int ret = CeRapiInit();
//if (ret != 0)
//{
// //连接失败,获取失败代码
// int error = CeRapiGetError();
// //抛出异常
// Marshal.ThrowExceptionForHR(ret);
//} ///---采用异步连接---
Rapiinit ri = new Rapiinit();
ri.cbsize = Marshal.SizeOf(ri);
uint hRes = CeRapiInitEx(ref ri);
ManualResetEvent me = new ManualResetEvent(false);
me.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(ri.heRapiInit, false);
if (!me.WaitOne(TimeOut, true))
{
CeRapiUninit();
} //2、PC复制文件到PDA IntPtr remoteFile = IntPtr.Zero;
String LocalFileName = @"D:\test.txt";//本地计算机文件名
String RemoteFileName = @"\ResidentFlash\Fire\test.txt";//远程设备文件名
byte[] buffer = new byte[0x1000];//传输缓冲区定义为4k
FileStream localFile; int bytesread = ;
int bytesrwritten = ;
int filepos = ; //创建远程文件
remoteFile = CeCreateFile(RemoteFileName, GENERIC_WRITE, , , CREATE_NEW, FILE_ATTRIBUTE_NORMAL, );
//检查文件是否创建成功
if ((int)remoteFile == INVALID_HANDLE_VALUE)
{
throw new Exception("Could not create remote file.");
}
else
{
//打开本地文件
localFile = new FileStream(LocalFileName, FileMode.Open);
//读取4k字节
bytesread = localFile.Read(buffer, filepos, buffer.Length);
while (bytesread > )
{
//移动文件指针到已读取的位置
filepos += bytesread;
//写缓冲区数据到远程设备文件
if (!Convert.ToBoolean(CeWriteFile(remoteFile, buffer, bytesread, ref bytesrwritten, )))
{
//检查是否成功,不成功关闭文件句柄,抛出异常
CeCloseHandle(remoteFile);
throw new Exception("Could not write to remote file.");
}
try
{
//重新填入本地缓冲区
bytesread = localFile.Read(buffer, , buffer.Length);
}
catch(Exception)
{
bytesread = ;
}
}
}
//关闭本地文件
localFile.Close();
//关闭远程文件
CeCloseHandle(remoteFile); //3、断开连接 文件句柄使用后一定要释放 CeRapiUninit(); } [StructLayout(LayoutKind.Explicit)]
private struct Rapiinit
{
[FieldOffset()]
public int cbsize;
[FieldOffset()]
public readonly IntPtr heRapiInit;
[FieldOffset()]
private readonly IntPtr hrRapiInit;
} [DllImport("rapi.dll")]
private static extern uint CeRapiInitEx(ref Rapiinit pRapiInt); [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 CeCloseHandle(IntPtr hObject); [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, SetLastError = true)]
internal static extern IntPtr CeCreateFile(string lpFileName, uint dwDesireAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
internal static extern int CeRapiUninit();

MSDN:https://msdn.microsoft.com/zh-cn/ee497185

Remote API(RAPI)之 文件管理的更多相关文章

  1. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  2. 【转+自己研究】新姿势之Docker Remote API未授权访问漏洞分析和利用

    0x00 概述 最近提交了一些关于 docker remote api 未授权访问导致代码泄露.获取服务器root权限的漏洞,造成的影响都比较严重,比如 新姿势之获取果壳全站代码和多台机器root权限 ...

  3. Docker remote API简单配置使用

    1.启动docker remote API的方式如下: docker -d -H uninx:///var/run/docker.sock -H tcp://0.0.0.0:5678 2.但是为了伴随 ...

  4. V-REP Remote API(C++)实现简单的关节转动

    基础内容参考:https://www.cnblogs.com/eternalmoonbeam/p/10753149.html V-REP客户端设置: 在V-REP场景文件中需要添加三个实体,包括两个形 ...

  5. docker remote api enable in ubuntu

    现在使用docker作为开发环境,操作系统是ubuntu16.10,pycharm中使用remote interpreter,需要用到remote api,结果发现自己的原答案是针对ubuntu 14 ...

  6. Docker Remote API v1.24

    1. Brief introduction The Remote API has replaced rcli. The daemon listens on unix:///var/run/docker ...

  7. 关于docker remote api未授权访问漏洞的学习与研究

    漏洞介绍: 该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker. docker ...

  8. docker 开启remote api

    docker官方文档上有相关说明(Configure and run Docker on various distributions),ubuntu上是可行的 sudo vi /etc/default ...

  9. Docker开启Remote API 访问 2375端口

    Docker常见端口 我看到的常见docker端口包括: 2375:未加密的docker socket,远程root无密码访问主机2376:tls加密套接字,很可能这是您的CI服务器4243端口作为h ...

  10. Docker remote API

    Docker remote API 该教程基于Ubuntu或Debian环境,如果不是,请略过本文 Docker API 在Docker生态系统中一共有三种API Registry API:提供了与来 ...

随机推荐

  1. 【LOJ】#2985. 「WC2019」I 君的商店

    LOJ#2985. 「WC2019」I 君的商店 一道很神仙的题啊QAQ 居然是智商题--不是乱搞或者是大数据 我们可以用2N问出一个最大值是1 然后对于任意两个值\(x + y\)和\(a\)比较 ...

  2. DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验

    序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...

  3. 从入门到自闭之Python集合,深浅拷贝(大坑)

    小数据池 int: -5~256 str: 字母,数字长度任意符合驻留机制 字符串进行乘法时总长度不能超过20 特殊符号进行乘法时只能乘以0 代码块: 一个py文件,一个函数,一个模块,终端中的每一行 ...

  4. hadoop-InputFormat-Split-任务并行度

    首先来看 MapReduce 流程图 一个 map,一个 reduce,中间靠 shuffle 连接,shuffle 左边被划分到 map,右边被划分到 reduce InputFormat inpu ...

  5. es6 getter setter

    https://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable 1. 我要 getter ...

  6. NPOI_winfrom导出Excel表格(二)(直接打开Excel软件,将数据填充在当前的sheet中)

    //// 存储路径弹框选择 SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "xls&qu ...

  7. AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装

    1# 封装类 public static class CmdHelper { /// <summary> /// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批 ...

  8. O061、Boot from Volume

    参考https://www.cnblogs.com/CloudMan6/p/5679384.html   Volume 除了可以用作Instance的数据盘,也可以作为启动盘(Bootable Vol ...

  9. 利用Cmake 将最新版本OBS编译成windows版本。

    准备工作: 1. VS2013 的最新更新版或者VS2015 2. QT Creater 5.7   https://www.qt.io/ 3.  CMake (cmake-gui) 4. obs 依 ...

  10. django 上传路径至vue处理组件加载

    1,在主目录(项目目录)下新建中间件middleware.py文件 写入 from django.utils.deprecation import MiddlewareMixin from djang ...