Creación de un archivo vacío en Ruby: ¿equivalente "táctil"?

119

¿Cuál es la mejor manera de crear un archivo vacío en Ruby?

Algo similar al comando de Unix, toque :

touch file.txt
Abhi Beckert
fuente
5
Siempre puedes hacerlo`touch file.txt`
Mark Thomas
8
@Mark: ¿incluso en ventanas?
Marc-André Lafortune
1
¿Personas que se preocupan por la programación adecuada independiente de la plataforma? :-)
TJ Biddle

Respuestas:

181

FileUtils.touchse parece a lo que hace y refleja * el touchcomando:

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

* A diferencia de touch (1), no puede actualizar mtime o atime solo. También le faltan algunas otras buenas opciones.

Dave Newton
fuente
@ 5chdn ¿Quieres decir sin los parens? Sí, los parámetros relacionados con los parámetros del método son (a veces) opcionales.
Dave Newton
44

Si le preocupan los identificadores de archivos:

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

De los documentos :

Si se proporciona el bloque de código opcional, se pasará el archivo abierto como argumento y el objeto Archivo se cerrará automáticamente cuando finalice el bloque.

Michael Kohl
fuente
Gracias, estoy enviando el nuevo archivo a otro proceso, por lo que el identificador debe cerrarse inmediatamente.
Abhi Beckert
12
Vale la pena señalar que esto en realidad no refleja touch: sobrescribirá el archivo si existe.
MrTheWalrus
3
Utilice el modo anexar y el archivo no se truncará si ya existe File.open ("foo.txt", "a") {} Esto tampoco refleja 'touch', pero luego 'touch (1)' no se la pregunta.
G. Allen Morris III
El uso de "a" no actualiza mtime. ("toque" era el subtítulo, por lo que Google nos trae personas que quieren un toque Ruby).
Martin Dorey
en los sistemas * nix, ¿quién es el propietario del archivo cuando se crea de esta manera?
Islam Azab
24

En Ruby 1.9.3+, puede usar File.write(también conocido como IO.write):

File.write("foo.txt", "")

Para una versión anterior, require "backports/1.9.3/file/write"use oFile.open("foo.txt", "w") {}

Marc-André Lafortune
fuente
Eso es mucho más limpio, pero desafortunadamente necesito ser compatible con versiones anteriores. Sin embargo, lo tendré en cuenta para uso futuro.
Abhi Beckert
2

Y también, menos ventajoso, pero muy breve:

`touch file.txt`
Boris Stitnicky
fuente
3
Tendrá precios separados, por lo que es muy lento.
denis.peplin
Y ya se menciona en los comentarios, que no he notado antes.
Boris Stitnicky
-1

Solo un ejemplo:

File.open "foo.txt", "w"
WarHog
fuente
1
¿Esto deja un identificador de archivo abierto atrás, como lo haría en otros idiomas?
Abhi Beckert
4
@Abhi: Lo hace, pero la recolección de basura lo manejará en algún momento. Sin embargo, para evitar eso, pase un bloque vacío (ver la respuesta de Michael Kohl)
Marc-André Lafortune
¿Cuándo sucederá "en algún momento"? ¿Al final del script o inmediatamente porque no se le ha asignado ninguna variable? Estoy creando el archivo para que otros procesos del sistema puedan comenzar a trabajar con él de inmediato y se bloquearán si el identificador del archivo aún está abierto para escritura.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () resuelve el problema de manejo de archivos, pero FileUtils.touch es una mejor solución.
Michael Campbell
No deje identificadores de archivos abiertos como ese :-)
sekmo