Ruby - 如何删除文件中的最后一个字符?

6
似乎这应该很容易,但我就是想不出来。如何使用Ruby IO删除文件的最后一个字符?
我查看了使用Ruby删除文件的最后一行的答案,但没有完全理解,肯定有更简单的方法。
有什么帮助吗?
2个回答

11

这里介绍了 File.truncate

truncate(file_name, integer) → 0

将文件 file_name 截断为最多 integer 字节长。不是所有平台都支持此功能。

因此,您可以这样说:

File.truncate(file_name, File.size(file_name) - 1)

这应该会通过一次系统调用来截断文件,以调整文件系统中文件的大小,而不需要复制任何内容。

请注意,并非所有平台都可用的警告。 File.truncate 应该在任何类Unix系统(例如Linux或OSX)上都可以使用,但我对Windows支持无法提供有用信息。


我在OSX上,这个完美地运行。非常简单易懂,谢谢! - Dylan
在Windows上对我有用。一个小问题是:我想要删除最后一行的换行符,所以我需要使用File.truncate(file_name, File.size(file_name) - 2)(删除CR + LF)。 - knut

3

我猜您是指一个文本文件。更改它的常规方法是读取它,进行更改,然后写入一个新文件:

  text = File.read(in_fname)
  File.write(out_fname, text[0..-2])

请在in_fname中输入您要读取的文件名,在out_fname中输入您要写入的文件名。它们可以是同一个文件,但如果这是您的意图,则更安全的方法是先写入一个临时文件,然后将临时文件复制到原始文件,最后删除临时文件。这样,如果在操作完成之前发生错误,您可能仍然拥有原始或临时文件。text[0..-2]是一个由除最后一个字符外所有读取的字符组成的字符串。您也可以选择这样做:
  File.write(out_fname, File.read(in_fname, File.stat(in_fname).size-1))

你觉得它不存在,或者找不到了吗? IO.writeFile.superclass #=> IO - Cary Swoveland
抱歉,我删除了我的评论,因为我发现Ruby 2.0.0确实有File.write。不过奇怪的是它在这里没有列出:http://www.ruby-doc.org/core-2.1.0/File.html。你提供的链接是关于IO对象的实例方法,而不是类方法(看它只接受一个字符串,而不是文件名?)你的代码可以工作,但我找不到File.write的文档。 - David Grayson
1
http://www.ruby-doc.org/core-2.1.0/IO.html#method-c-write 是上述上下文中使用的 IO.write 的链接。 - bjhaid
IO 既有公共类方法,又有公共实例方法。我错误地指向了实例方法。 @bjhaid 给出了类方法的引用。 - Cary Swoveland

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