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, 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值