zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C# webBrowser禁止在新窗口打开,强制在本窗口打开
    C# StatusStrip状态栏 例程
    iphone实现弹出框视图
    在iOS开发中使用FMDB
    XCode 4.2 新功能 Storyboard
    FMDB一个sqlite的封装
    Xcode 4的新特性
    sqlite加密SQLCipher
    跨iPhone应用程序的方便,模块化的代码共享:静态库和跨项目的引用
    Navicat for SQLite For Ma OS X
  • 原文地址:https://www.cnblogs.com/zuibunan/p/3876221.html
Copyright © 2011-2022 走看看