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?


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

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"

25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }

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.


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.


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.


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"

1
data = 'data you want inside the file'.

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.