2010-05-06 16 views

Respuesta

153

El Rubí File class le dará los pormenores de ::new y ::open pero su padre, el IO class, entre en la profundidad de #read y #write.

+5

Gracias @Geoff. Es bueno ver a los nuevos usuarios limpiando preguntas y respuestas desactualizadas. Logra un mejor sitio en general. – jdl

+5

Encuentro esto irónico. La respuesta está muy bien documentada ... pero ahora, un año después, esta pregunta es el primer éxito en Google. Cuando se formuló la pregunta, puede parecer que el PO estaba dedicando poco esfuerzo, pero ahora, en lo que respecta a Google, esta es la mejor fuente. – Jeff

+6

Probablemente porque todo lo que realmente necesitas saber está aquí. La mía es la respuesta "enséñale a un hombre a pescar" para aquellos que quieran leer los detalles más finos, y hay muchas respuestas para "dar un hombre un pez" aquí también para las personas que solo quieren cortar y pegar. No es sorprendente que esta combinación termine bien clasificada en Google. – jdl

786

¿Estás buscando lo siguiente?

File.open(yourfile, 'w') { |file| file.write("your text") } 
+2

Probablemente devuelva el número de caracteres afectados. Necesito un objeto de archivo a cambio. ¿Algunas ideas? – Prem

+5

'yourfile' es una variable que contiene el nombre del archivo que se escribirá. –

+11

Alternativamente: f = File.open ('nombre', 'w'); f.write ('text'); f.close – vish

211

Esto se enfoque preferido en la mayoría de los casos:

File.open(yourfile, 'w') { |file| file.write("your text") } 

Cuando un bloque se pasa a File.open, el objeto del archivo se cerrará automáticamente cuando el bloque termina.

Si no pasa un bloque al File.open, debe asegurarse de que el archivo esté cerrado correctamente y que el contenido se haya escrito en el archivo.

begin 
    file = File.open("/tmp/some_file", "w") 
    file.write("your text") 
rescue IOError => e 
    #some error occur, dir not writable etc. 
ensure 
    file.close unless file.nil? 
end 

usted lo puede encontrar en documentation:

static VALUE rb_io_s_open(int argc, VALUE *argv, VALUE klass) 
{ 
    VALUE io = rb_class_new_instance(argc, argv, klass); 
    if (rb_block_given_p()) { 
     return rb_ensure(rb_yield, io, io_close, io); 
    } 
    return io; 
} 
+0

Sí, usando la sintaxis del bloque con {| archivo | ....} cerrará el archivo cuando se cierre el bloque. – wesgarrison

+0

Cool, gracias. No estaba seguro de eso. Aquí hay más información sobre bloques y 'File.open' http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html también se menciona en la documentación oficial – Tombart

+1

Simplemente algo ruby ​​way-ish: nil es un objeto, por lo que para comprobar si un archivo es nulo, se pregunta al objeto en lugar de comparar (file.nil? en lugar de file == nil) – JCabello

99

respuesta Zambri 's found here es la mejor.

File.open("out.txt", '<OPTION>') {|f| f.write("write your stuff here") } 

donde sus opciones para <OPTION> son:

r - de sólo lectura. El archivo debe existir.

w - Cree un archivo vacío para escribir.

a - Agregar a un archivo. El archivo se crea si no existe.

r+ - Abre un archivo para actualizar tanto la lectura como la escritura. El archivo debe existir.

w+ - Crea un archivo vacío para leer y escribir.

a+ - Abre un archivo para leer y anexar. El archivo se crea si no existe.

En su caso, es preferible w.

476

Puede utilizar la versión corta:

File.write('/path/to/file', 'Some glorious content') 

Devuelve la longitud escrita; ver ::write para más detalles y opciones.

+13

FYI este método abreviado solo funciona comenzando con Ruby 1.9.3. No hay tal método en ninguna versión anterior de 1.9 o 1.8. En ese caso, debe usar el método de bloque más largo publicado por @mvndaai –

+7

, para su información, esto cierra correctamente el archivo cuando termina. –

+2

[documentos de la clase IO] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-write) dicen que cierra el archivo – nruth

29

Para aquellos de nosotros que aprendemos con el ejemplo ...

Escribir texto en un archivo de la siguiente manera:

IO.write('/tmp/msg.txt', 'hi') 

INFO PRIMA ...

Leer de nuevo como esto

IO.read('/tmp/msg.txt') 

frecuentes, quiero leer un archivo en mi portapapeles ***

Clipboard.copy IO.read('/tmp/msg.txt') 

Y otras veces, quiero escribir lo que está en mi portapapeles a un archivo ***

IO.write('/tmp/msg.txt', Clipboard.paste) 

*** asume que ha instalado la gema portapapeles

Ver: https://rubygems.org/gems/clipboard

+0

Tenga cuidado con la opción 'IO.write' ** sobrescribir ** el contenido del archivo en lugar de agregar. Agregar con IO.write es un poco tedioso. – fguillen

+0

¿No estás seguro de lo que estás hablando? El comando IO.write no necesita esa opción para escribir en un archivo. Tendría cuidado de guardar el archivo en el directorio/tmp o en el directorio actual; De lo contrario, es posible que vea un mensaje 'Errno :: ENOENT: No such such file or directory @ rb_sysopen' y el archivo creado con un tamaño de 0 bytes. – l3x

14

para destruir la contenido anterior del archivo, a continuación, escribir una nueva cadena en el archivo:

open('myfile.txt', 'w') { |f| f << "some text or data structures..." } 

para anexar a un archivo sin sobrescribir sus contenidos antiguos:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Cuestiones relacionadas