lua 的 WriteFile 和 ReadFile
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的更多相关文章
- Win32 WriteFile and ReadFile
HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, // 文件路径 __in DWORD dwDesiredAccess, // 访问权限,GENER ...
- VC串口通讯,WriteFile或ReadFile没有任何返回??
别犯低级错误,一定要设置读写超时!!!
- quick-cocos2d-x的热更新机制实现
quick-cocos2d-x的热更新机制实现 0 依赖 这里说的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新api,根据更新api的反馈,下载更新资源,然后使用新的资源启动客户 ...
- 黑马程序员_Java基础:IO流总结
------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...
- swift GCD使用指南
swift GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适 ...
- java Memorymapfile demo
String lineseperator = java.security.AccessController .doPrivileged(new sun.security.action.GetPrope ...
- Java IO(四)
对象序列化 对象序列化又叫对象的持久化,对象的串行化(或反串行化) 当使用Serializable接口实现序列化操作时,如果一个对象中的某个属性不希望被序列化,则可以使用transient关键字进行声 ...
- Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)
一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...
- Windows与自定义USB HID设备通信说明.
1 . 所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...
随机推荐
- html5+ plus和phoneGap、cordova的比较
偶遇大神言论,摘录 phonegap出的早,自然用的人多.phonegap自己的定位是混合开发hybrid,用原生+js:HBuilder的定位是纯js搞定一切.5+ 和 phonegap在能力.性能 ...
- Tomcat配置HTTPS方式生成安全证书
在Tomcat 6中配置SSL双向认证是相当容易的,本文将介绍如何使用JDK的keytool来为Tomcat配置双向SSL认证.并实现批量生成证书 系统需求:JDK 5.0Tomcat 6.0.16启 ...
- OS X 使用技巧——不用鼠标就能打开应用程序
如果要打开的应用程序没有保留在Dock栏里,一种快速启动它的办法是按住Control+Space键后再输入应用程序的名称.按Control+Space键会开启聚光灯(Spotlight)搜索工具,它会 ...
- 标准SQL
1. SQL语句对大小写不敏感! 2. 查询和更新指令构成了 SQL 的 DML 部分: SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中 ...
- Core Data数据库迁移
一. Lightweight Migration i. 适合场景 Simple addition of a new attribute Removal of an attribute A non-op ...
- JavaScript原生折叠扩展收缩菜单带缓冲动画
JavaScript原生折叠扩展收缩菜单带缓冲动画 @落雨 <div id="div_two" style="display: none;"> &l ...
- 关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题
费劲N多力气编译通过之后,最后启动程序过程中却突然得到“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题, 分析究其原因是定位不到zlib1.dll,都知道,程序在找dll的时 ...
- Native App执行JS
iOS: - (void)webViewDidFinishLoad:(UIWebView *)webView{ //js方法名+参数 NSString* jsCode = [NSS ...
- O2O模式成功案例分享 汲取精华化为己用
本文通过分享一些公司的o2o成功案例让您了解什么是O2O,o2o的优势,o2o模式有哪些,未来我们要如何做o2o才更有竞争力,学牛人的o2o创新玩法,摸索适合自己的o2o思路.拥抱o2o - 传统企业 ...
- 通过HTML条件注释判断IE版本的HTML语句详解<!--[if IE]> <![endif]-->
我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...