Cómo crear un archivo en Ruby

170

Estoy tratando de crear un nuevo archivo y las cosas no parecen funcionar como lo espero también. Esto es lo que he intentado:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

Según todo lo que he leído en línea, todos deberían funcionar, pero cada uno de ellos me da esto:

ERRNO::ENOENT: No such file or directory - out.txt

Esto sucede tanto de IRB como de un script Ruby. ¿Qué me estoy perdiendo?

Civatrix
fuente
13
Los dos primeros no deberían funcionar, pero los dos últimos son sinónimos y definitivamente deberían funcionar.
Andrew Marshall
@ Andrew: ¿Estás pensando que solo se probaron los dos primeros?
mu es demasiado corto el
1
@muistooshort Esa es la única conclusión a la que puedo llegar. Hubiera arrojado un error de permisos Errno::EACCES, no ENOENT.
Andrew Marshall
2
OK, ahora me siento estúpido. Los dos primeros definitivamente no funcionan, pero los dos últimos sí. No estoy seguro de cómo me convencí de que los había probado. Perdón por perder el tiempo de todos.
Civatrix
1
@Civatrix Eso no es problema. Todos perdemos el tiempo a veces.
Darth Egregious

Respuestas:

434

Utilizar:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

donde están tus opciones:

  • r- Solo lectura. El archivo debe existir.
  • w - Crear un archivo vacío para escribir.
  • a - Agregar a un archivo. El archivo se crea si no existe.
  • r+- Abra un archivo para actualizar tanto la lectura como la escritura. El archivo debe existir.
  • w+ - Cree un archivo vacío para leer y escribir.
  • a+- Abra un archivo para leer y agregar. El archivo se crea si no existe.

En su caso, 'w'es preferible.

O podrías tener:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
zanbri
fuente
11
gran respuesta. Ruby conevntion es un caso de serpiente para los nombres var. Solo un aviso para los novatos. outFiledebería verse así out_file.
Adam Waite
3
@AdamWaite Edité la respuesta según su sugerencia de snake_case, dejando este comentario para el contexto.
Kris
3
@zanbri: ¿qué sucede si no cierro el archivo?
Erran Morad
1
gran respuesta, completa y breve
Boris
2
@BoratSagdiyev "Un objeto de archivo al que ya no se hace referencia se vuelve elegible para la recolección de basura. El archivo se cerrará automáticamente cuando el objeto de archivo se recolecte". rootr.net/rubyfaq-9.html
jkdev
35

Tratar

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

sin usar el

File.new "out.txt"
GMD
fuente
25

Intente usarlo "w+"como modo de escritura en lugar de solo "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
fuente
44
Depende de si desea escribir solo ( w) o tanto leer como escribir ( w+).
jkdev
20

OK, ahora me siento estúpido. Los dos primeros definitivamente no funcionan, pero los dos últimos sí. No estoy seguro de cómo me convencí de que los había probado. Perdón por perder el tiempo de todos.

En caso de que esto ayude a alguien más, esto puede ocurrir cuando intenta crear un nuevo archivo en un directorio que no existe.

tom
fuente
11

El directorio no existe. Asegúrese de que exista, ya openque no creará esos directorios por usted.

Me encontré con esto hace un tiempo.

nterry
fuente
11

File.newy File.openpredeterminado para leer el modo ( 'r') como mecanismo de seguridad, para evitar posiblemente sobrescribir un archivo. Tenemos que decirle explícitamente a Ruby que use el modo de escritura ( 'w'es la forma más común) si vamos a generar el archivo.

Si el texto que se generará es una cadena, en lugar de escribir:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

o peor:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

Usa el más sucinto write:

File.write('foo.txt', 'bar')

writeha permitido modos así que podemos usar 'w', 'a', 'r+'si es necesario.

opencon un bloque es útil si tiene que calcular la salida en un ciclo iterativo y desea dejar el archivo abierto mientras lo hace. writees útil si va a generar el contenido de una sola vez y luego cierre el archivo.

Consulte la documentación para más información.

el hombre de hojalata
fuente
Gran respuesta, esta es la forma más idiomática y, por lo tanto, la "Rubyista". Debería ser la mejor respuesta.
Gino
Bueno, estoy de acuerdo. Raramente uso el formulario de bloque para escribir archivos. Es demasiado ruidoso visualmente.
The Tin Man
11

Si el objetivo es solo crear un archivo, la forma más directa que veo es:

 FileUtils.touch "foobar.txt"
Nicola Mingotti
fuente
1
data = 'data you want inside the file'.

Puedes usar File.write('name of file here', data)

ispirett
fuente
0

También puede usar constantes en lugar de cadenas para especificar el modo que desea. El beneficio es que si cometes un error tipográfico en un nombre constante, tu programa generará una excepción de tiempo de ejecución.

Las constantes son File::RDONLYo File::WRONLYo File::CREAT. También puedes combinarlos si quieres.

Descripción completa de los modos de archivo abierto en ruby-doc.org

Alex Tamoykin
fuente