我尝试通过读取源文件来复制文件并将数据写入目标 - 失败。 我试着像这样使用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的情况下复制文件?
答案 0 :(得分:2)
您的代码存在各种问题。按顺序出现:
ch
必须是int
,否则256个有效字符中的一个可能会等同于EOF
。lua_tostring
可以返回NULL
。您应该检查或使用luaL_checkstring
。"rb"
和"wb"
)。fclose
文件句柄上调用fgetc
,fputc
和NULL
。那里可能有一些return
缺失。EOF
是否表示文件末尾或I / O错误。1
)告诉Lua Lua堆栈中有多少值传递回调用函数。您返回一个值,但在某些情况下,您不会将任何值推送到Lua堆栈,而在其他情况下,您会推送多个值。答案 1 :(得分:1)
首先,在unixoids上,text-mode和binary-mode是相同的,在任何Windows框中都找不到快乐状态。
使用二进制模式,除非您希望翻译文本文件!
第二个问题,当然,如果逐个字符,它会很慢,因为启用了多线程的运行时必须为每个调用锁定和解锁。
获得一些不错的缓冲区,2 12 字节应该很好,并使用fread
/ fwrite
。
答案 2 :(得分:1)
在Windows上读/写时,需要以二进制模式打开文件,否则可能会出现文件末尾和文件结束处理文件。添加"b" modifier。