• lua 的 WriteFile 和 ReadFile


    lua 的 ReadFile 和 WriteFile
    
    注意:
    lua 代码中的 string 可以包含二进制数据 string.len(str) 不会被 '' 截断
    从 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;
    }
  • 相关阅读:
    【SSRS】入门篇(六) -- 分组和总计
    【SSRS】入门篇(五) -- 设置报表格式
    【SSRS】入门篇(四) -- 向报表添加数据
    【SSRS】入门篇(三) -- 为报表定义数据集
    【SSRS】入门篇(二) -- 建立数据源
    【SSRS】入门篇(一) -- 创建SSRS项目
    【MS SQL】数据库维护计划之数据库备份(二)
    【MS SQL】数据库维护计划之数据库备份(一)
    【MS SQL】查看任务执行进度
    c++ 在客户端的GCC使用
  • 原文地址:https://www.cnblogs.com/zuibunan/p/3876221.html
Copyright © 2020-2023  润新知