Lua中WriteFile和ReadFile

原创 2016年05月31日 17:31:01
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

CreateFile,ReadFile,WriteFile,DeviceIoControl,CloseHandle .

一、*****CreateFile*****     这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象: 控制台对象、通信资源对象、目录对象(只能打开)、磁盘设备对象、文件对象、...

WinCE的API函数WriteFile和ReadFile函数

读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件...
  • softn
  • softn
  • 2012年04月25日 14:02
  • 332

<Win32 API> 文件操作CreateFile/ReadFile/WriteFile

1. CreateFile/ReadFile/WriteFile CreateFile函数原型: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dw...

串口通信中ReadFile和WriteFile的超时详解!

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调...
  • Augusdi
  • Augusdi
  • 2013年08月23日 14:09
  • 10605

使用API进行文件读写——CreateFile,ReadFile,WriteFile等

原文:simple and easy——API文件读写类http://www.vbgood.com/thread-102870-1-1.html看了这个帖子: http://www.vbgood.c...
  • dahual
  • dahual
  • 2011年04月16日 17:21
  • 4178

Windows API应用:CreateFile,WriteFile,ReadFile

CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式 ReadFile 或 WriteFile 都是对二进制数据进行操作 HANDLE WINAPI Creat...

CreateFile、WriteFile、ReadFile

读写文件每一个软件开发显目必定涉及的工作。CreateFile函数用于创建对应的文件句柄,WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。CreateFile ...

串口之ReadFile、WriteFile函数详解

BOOL ReadFile(   HANDLE hFile, //文件的句柄   LPVOID lpBuffer, //用于保存读入数据的一个缓冲区   DWORD nNumberOfByte...

串口通信中ReadFile和WriteFile的超时详解!

在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua中WriteFile和ReadFile
举报原因:
原因补充:

(最多只允许输入30个字)