如何在Ruby中删除文件的最后一行?

7

我正在访问一个文件,在向其追加内容之前,我想删除文件中的最后一行。在Ruby中有没有高效的方法来实现这个功能?

以下是我用来访问该文件的代码:

file = File.new("imcs2.xml", "a")
3个回答

6
我不会猜测你的意图,但如果你想要去掉XML文件中根元素的闭合标签以添加更多子标签,那么重新添加闭合根标签,我想可能有Ruby模块可帮助编写/编辑XML。只是这样说。
也许可以使用Builder: hpricot 似乎也可以工作:

你应该成为一名通灵者 :). 这正是我想做的事情,这只是一个小的hack工作,所以我没有做太多的研究,但感谢你额外付出的努力! - Javed Ahamed
没问题!很抱歉我没有给出一个明确的答案,但我几乎可以确定有工具可以帮你完成这个任务。我搜索了大约15分钟,找到了以下这些工具。当然,你有完成项目的动力,肯定会找到更多、更好的解决方案,以防我提供的不够用。 - Jorge Israel Peña

4
假设您想删除文件的最后一行,可以使用以下方法,该方法定位最后一行的开头并从那里开始写入:
last_line = 0
file = File.open(filename, 'r+')
file.each {  last_line = file.pos unless file.eof? }

file.seek(last_line, IO::SEEK_SET)
#Write your own stuff here
file.close

只要你在文件的最后一行中替换文本比原始文本长,这就可以工作。如果它比原始文本短,剩余部分将被推入插入行之后的新行中。 - Excalibur

1

最简单的方法就是读取整个文件,删除末尾的 '\n',然后用自己的内容重新写入:

filename = "imcs2.xml"
content = File.open(filename, "rb") { |io| io.read }
File.open(filename, "wb") { |io|
    io.print content.chomp
    io.print "yourstuff"    # Your Stuff Goes Here
}

或者,如果有的话,只需通过 io.seek() 向后移动到最后一个换行符:

filename = "imcs2.xml"
File.open(filename, "a") { |io|
    io.seek(-1, IO::SEEK_CUR)  # -1 for Linux, -2 for Windows: \n or \r\n
    io.print "yourstuff"    # Your Stuff Goes Here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接