lua 的 ReadFile 和 WriteFile

注意:
lua 代码中的 string 可以包含二进制数据 string.len(str) 不会被 '\0' 截断
从 lua 传入 c 时: 需要传入包含二进制数据的 string 和数据的 size, size 用 string.len(str) 来计算
从 c 传入 lua 时: 应该使用 lua_pushlstring 而不是 lua_pushstring, lua_pushstring 内部使用 strlen() 来计算数据的长度,而 lua_pushlstring 需要传入一个 size int LuaFileSystem::ReadFile( lua_State* luaState )
{
if (!lua_isstring(luaState, ))
{
return ;
}
const char* strPath = luaL_checkstring(luaState, );
std::wstring wstrPath;
TransCode::UTF8_to_Unicode(strPath, strlen(strPath), wstrPath);
HANDLE hFile = ::CreateFile(wstrPath.c_str(), GENERIC_READ, , NULL, OPEN_EXISTING, NULL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD nFileSize = ::GetFileSize(hFile, NULL);
char* lpBuffer = new char[nFileSize];
DWORD nNumberOfBytesRead;
BOOL bRet = ::ReadFile(hFile, lpBuffer, nFileSize, &nNumberOfBytesRead, NULL); lua_pushlstring(luaState, lpBuffer, nNumberOfBytesRead);
delete[] lpBuffer;
CloseHandle(hFile);
return ;
}
return ;
} int LuaFileSystem::WriteFile( lua_State* luaState )
{
if (!lua_isstring(luaState, ) || !lua_isstring(luaState, ))
{
return ;
}
const char* strPath = luaL_checkstring(luaState, );
const char* strContent = luaL_checkstring(luaState, );
int nContentSize = strlen(strContent);
if (lua_isnumber(luaState, ))
{
nContentSize = luaL_checkint(luaState, );
}
std::wstring wstrPath;
TransCode::UTF8_to_Unicode(strPath, strlen(strPath), wstrPath);
HANDLE hFile = ::CreateFile(wstrPath.c_str(), GENERIC_WRITE, , NULL, CREATE_ALWAYS, NULL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD nNumberOfBytesWritten;
::WriteFile(hFile, strContent, nContentSize, &nNumberOfBytesWritten, NULL);
CloseHandle(hFile);
}
return ;
}

lua 的 WriteFile 和 ReadFile的更多相关文章

  1. Win32 WriteFile and ReadFile

    HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, // 文件路径 __in DWORD dwDesiredAccess, // 访问权限,GENER ...

  2. VC串口通讯,WriteFile或ReadFile没有任何返回??

    别犯低级错误,一定要设置读写超时!!!

  3. quick-cocos2d-x的热更新机制实现

    quick-cocos2d-x的热更新机制实现 0 依赖 这里说的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新api,根据更新api的反馈,下载更新资源,然后使用新的资源启动客户 ...

  4. 黑马程序员_Java基础:IO流总结

    ------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...

  5. swift GCD使用指南

    swift GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适 ...

  6. java Memorymapfile demo

    String lineseperator = java.security.AccessController .doPrivileged(new sun.security.action.GetPrope ...

  7. Java IO(四)

    对象序列化 对象序列化又叫对象的持久化,对象的串行化(或反串行化) 当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化,则可以使用transient关键字进行声 ...

  8. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  9. Windows与自定义USB HID设备通信说明.

    1 .   所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...

随机推荐

  1. 【AFNetworking】AFNetworking源码阅读(一)

    1. 前言 2. iOS Example代码结构 3.AFNetworkActivityIndicatorManager 4. UIRefreshControl+AFNetworking 5. AFN ...

  2. 字符串比较 忽略大小写 iphone

    //不考虑大小写比较字符串1 NSString *astring01 = @"this is a String!"; NSString *astring02 = @"Th ...

  3. linux入门基础_centos(二)--fdisk分区

    课时10 使用fdisk进行磁盘管理             fdisk是来自IBM的老牌分区工具,支持绝大多数的操作系统,几乎所有的linux的发行版本都装有fdisk,包括在linux的rescu ...

  4. Node.js 学习(二) 创建第一个应用

    如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...

  5. 十个优秀的C语言学习资源推荐

    学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.-- Boatman Yang 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程序员不得不跟 ...

  6. 【Merge Two Sorted Lists】cpp

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  7. MD5加密(C#)

    先来说说Md5 MD5为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. md5有很多广泛的功能.大家都知道,数据库里面密码不会直接存该密码,而是加密之后的字符串.这时候你就可以把密码 ...

  8. 开发EXTMVC框架前需要了解的基础知识整理

    1.组件选择器 目的:了解如何选择Extjs中的组件,就跟学习jquery时一定会先要学习:$()选择器一样. 常用场景:       1.在controller中的control事件中用到      ...

  9. redis.conf配置

    # Redis configuration file example # Redis示例配置文件 # Note on units: when memory size is needed, it is ...

  10. 说说Thread.Sleep(0)的那些奇怪的事

    写在前面 最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0).那个问题竟然解决了,耗费我一上午 ...