2012-02-05 39 views
2

我尝试更新文件的某些部分,而不删除或覆盖其他任何内容,但Lua的读/写模式似乎只支持追加数据或删除现有数据并编写新的数据。这里有一个例子:Lua:更新文件十六进制编辑器样式的部分

testfile.pak:“这是外面冷” - >“这是温暖外”

现在,我处理相当大的文件,而不是文本的文件,所以阅读他们进入内存和只使用字符串操作函数在这里没有选择。另外,我已经将这些文件作为程序的一部分处理,所以我不想通过重新读取它们到必要的位置来增加开销,插入数据并写下其余部分。这需要两倍的硬盘空间和两倍的时间。我也不能在第一个处理周期中写入必要的数据。所以我想知道是否有可能告诉Lua写入文件中的某个偏移量而不必创建临时文件或重复文件,有点像十六进制编辑器能够更改文件的特定部分,而无需创建保存文件的全新副本。是否有其他 - 可能没有记录 - 为io.open写入除“w”,“w +”,“a”和“a +”之外的选项?

回答

6

你可以用 “R +” 模式下做到这一点:

~$ cat > test.dat 
It's cold outside. 
~$ lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> f = io.open('test.dat', 'r+') 
> f:seek("set", 5) 
> f:write("warm") 
> f:close() 
> 
~$ cat test.dat 
It's warm outside. 
~$ 
+0

非常感谢。这很好用!我不知道我仍然可以用“r +”模式打开文件来写入文件。另外,使用seek命令指定写入位置非常聪明。我有点认为它只用于阅读功能。 – Zerobinary99 2012-02-05 16:18:59

+0

是的,令人困惑的“r +”被称为“更新”模式(它允许你阅读那里的内容,但也可以在任何地方写)。为什么他们不使用“你”或别的东西,我不知道。 – 2012-02-05 17:00:33