【问题标题】:Lua: Can't copy .png fileLua:无法复制.png文件
【发布时间】:2014-10-08 07:20:27
【问题描述】:

我尝试通过读取源文件来复制文件并将数据写入目标 - 失败。 我尝试使用这样的 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")

但它非常sloooow...

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

【问题讨论】:

  • 您使用的是 Windows 还是 Unixoid?
  • 是的,我使用的是 Windows XP。我真的很喜欢 unix,但现在我需要编写 Windows 应用程序。

标签: lua


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 他使用的是 C 库,而不是 Lua 库。
    • 对,但是“b”模式解释是一样的:“这个字符串正是标准C函数fopen中使用的。”;只是参考 Lua 手册更快;)
    • 我尝试使用“r”模式打开图像并逐行读取图标 - 失败。我尝试用“rb”模式打开图像并读取数据 - 失败。我只得到“%PNG”文件...
    • 这是一张我们可以试用的公开图片吗?
    • 每个图像/文件都损坏了。所有示例都只是复制文件头,没有复制数据。
    【解决方案3】:

    首先,虽然在 unixoid 上文本模式和二进制模式是相同的,但在任何 Windows 机器上都找不到快乐状态。

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


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

    获取一些不错的缓冲区,212 字节应该不错,并使用fread / fwrite

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 2020-08-13
      • 1970-01-01
      • 2017-02-15
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多