在Ruby中创建一个空文件:“ touch”是否等效?


Answers:


180

FileUtils.touch看起来像它做什么,和镜子*touch命令:

require 'fileutils'
FileUtils.touch('file.txt')

*与touch(1)不同,您不能单独更新mtime或atime。它还缺少其他一些不错的选择。


@ 5chdn你的意思是没有父母?是的,方法参数周围的括号(有时)是可选的。
戴夫牛顿

44

如果您担心文件句柄:

File.open("foo.txt", "w") {}

文档

如果给出了可选代码块,它将作为参数传递给打开的文件,并且在该块终止时File对象将自动关闭。


谢谢,我正在将新文件发送到另一个进程,因此需要立即关闭该句柄。
Abhi Beckert

12
值得指出的是,这实际上并没有镜像touch-如果文件存在,它将覆盖文件。
MrTheWalrus

3
使用附加模式,如果文件已经存在File.open(“ foo.txt”,“ a”){}也不会被截断这也不会镜像'touch',但是'touch(1)'不会问题。
G.艾伦·莫里斯三世(

使用“ a”不会更新mtime。(“ touch”是副标题,因此Google带给我们想要Ruby触摸的人们。)
Martin Dorey 2013年

在* nix系统上,以这种方式创建文件时谁是文件所有者?
Islam Azab 2014年



-1

只是一个例子:

File.open "foo.txt", "w"

1
像其他语言一样,这会留下打开的文件句柄吗?
阿披·贝克特

4
@Abhi:可以,但是垃圾回收会在某个时候处理它。为了避免这种情况,但是,将一个空块(参见迈克尔·科尔的回答)
马克-安德烈·Lafortune

什么时候会发生?在脚本末尾,还是因为尚未将其分配给任何变量而立即结束?我正在创建文件,以便系统上的其他进程可以立即开始使用它,如果文件句柄仍处于打开状态以供写入,它们将被阻止。
阿披·贝克特

1
File.open(“ foo.txt”,“ w”)。close()解决了文件句柄问题,但FileUtils.touch是更好的解决方案。
迈克尔·坎贝尔

不要留下像这样的打开文件句柄:-)
sekmo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.