Lua:无法复制.png文件

时间:2014-10-07 17:49:37

标签: lua

我尝试通过读取源文件来复制文件并将数据写入目标 - 失败。 我试着像这样使用C扩展:

    static int copy(lua_State *L)
{
    char ch;
    FILE *source, *target;
    const char * source_file = lua_tostring(L, 1);
    const char * target_file = lua_tostring(L, 2);
    source = fopen(source_file, "r");
    if( source == NULL )
    {
        lua_pushnumber(L, 1);
    }
    target = fopen(target_file, "w");
    if( target == NULL )
    {
        fclose(source);
        lua_pushnumber(L, 1);
    }
    while( ( ch = fgetc(source) ) != EOF )
        fputc(ch, target);
        fclose(source);
        fclose(target);
    return 1;
}

此代码正常工作 - 我成功复制了文本文件,但是当我尝试复制.png图像时 - 我再次失败 - 在所有这些方法中,我得到了破碎的图像。 我只能通过以下方式复制图像:

os.execute("cp file1 file2")

但它很懒散......

如何在不使用os.execute的情况下复制文件?

3 个答案:

答案 0 :(得分:2)

您的代码存在各种问题。按顺序出现:

  1. ch必须是int,否则256个有效字符中的一个可能会等同于EOF
  2. lua_tostring可以返回NULL。您应该检查或使用luaL_checkstring
  3. 正如其他人已经说过的那样:以二进制模式打开这两个文件("rb""wb")。
  4. 请确保仅在非fclose文件句柄上调用fgetcfputcNULL。那里可能有一些return缺失。
  5. 您无需检查EOF是否表示文件末尾或I / O错误。
  6. 返回值(在您的情况下为1)告诉Lua Lua堆栈中有多少值传递回调用函数。您返回一个值,但在某些情况下,您不会将任何值推送到Lua堆栈,而在其他情况下,您会推送多个值。

答案 1 :(得分:1)

首先,在unixoids上,text-mode和binary-mode是相同的,在任何Windows框中都找不到快乐状态。

使用二进制模式,除非您希望翻译文本文件!


第二个问题,当然,如果逐个字符,它会很慢,因为启用了多线程的运行时必须为每个调用锁定和解锁。

获得一些不错的缓冲区,2 12 字节应该很好,并使用fread / fwrite

答案 2 :(得分:1)

在Windows上读/写时,需要以二进制模式打开文件,否则可能会出现文件末尾和文件结束处理文件。添加"b" modifier