首页 > 代码库 > 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。