标签:style blog color 使用 os 数据 代码 div
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; }
lua 的 WriteFile 和 ReadFile,布布扣,bubuko.com
标签:style blog color 使用 os 数据 代码 div
原文地址:http://www.cnblogs.com/zuibunan/p/3876221.html