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;
}
原文地址:https://www.cnblogs.com/zuibunan/p/3876221.html