首页 > 代码库 > lua 的 WriteFile 和 ReadFile

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 需要传入一个 sizeint 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;}