Lua中WriteFile和ReadFile

原创 2016年05月31日 17:31:01
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, 2))
    {
        return 0;
    }
    const char* strPath = luaL_checkstring(luaState, 2);
    std::wstring wstrPath;
    TransCode::UTF8_to_Unicode(strPath, strlen(strPath), wstrPath);
    HANDLE hFile = ::CreateFile(wstrPath.c_str(), GENERIC_READ, 0, 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 1;
    }
    return 0;
}


int LuaFileSystem::WriteFile( lua_State* luaState )
{
    if (!lua_isstring(luaState, 2) || !lua_isstring(luaState, 3))
    {
        return 0;
    }
    const char* strPath = luaL_checkstring(luaState, 2);
    const char* strContent = luaL_checkstring(luaState, 3);
    int nContentSize = strlen(strContent);
    if (lua_isnumber(luaState, 4))
    {
        nContentSize = luaL_checkint(luaState, 4);
    }
    std::wstring wstrPath;
    TransCode::UTF8_to_Unicode(strPath, strlen(strPath), wstrPath);
    HANDLE hFile = ::CreateFile(wstrPath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD nNumberOfBytesWritten;
        ::WriteFile(hFile, strContent, nContentSize, &nNumberOfBytesWritten, NULL);
        CloseHandle(hFile);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

lua读写文件

读写文件的模式: r - 读取模式w - 写入模式(覆盖现有内容) a - 附加模式(附加在现有内容之后) b - 二进制模式 r+ - 读取更新模式(现有数据保留) w+ - 写入更新模式...

使用API进行文件读写——CreateFile,ReadFile,WriteFile等

原文:simple and easy——API文件读写类http://www.vbgood.com/thread-102870-1-1.html看了这个帖子: http://www.vbgood.c...
  • dahual
  • dahual
  • 2011-04-16 17:21
  • 3941

Windows API应用:CreateFile,WriteFile,ReadFile

CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式 ReadFile 或 WriteFile 都是对二进制数据进行操作 HANDLE WINAPI Creat...

CreateFile、WriteFile、ReadFile

读写文件每一个软件开发显目必定涉及的工作。CreateFile函数用于创建对应的文件句柄,WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。CreateFile ...

[Win32]ReadFile/WriteFile 的文件同步读写

先来看看我很早之前写的两个函数,他们实现了简单的直接读写文件,读文件是把文件一股脑都读进来,写文件是覆盖原来的文件写入 //参数:文件名,输出的字符串指针 //返回值:读取的大小 DWORD MyRe...

串口通信中ReadFile和WriteFile的超时详解!

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调...

CreateFile ReadFile WriteFile 详解

1. 创建和打开文件 创建任何一种文件只需要用到API函数CreateFile,应用程序可以通过该函数指定文件的格式为读取、写入或两者皆可,也可以指定是否为共享文件。如果该文件名已经存在,则将其打开...

C/C++ 文件操作之CreateFile、ReadFile和WriteFile

1. CreateFile  这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HAN...

串口之ReadFile、WriteFile函数详解

BOOL ReadFile(   HANDLE hFile, //文件的句柄   LPVOID lpBuffer, //用于保存读入数据的一个缓冲区   DWORD nNumberOfByte...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)