with - write txt file ruby




Como criar um arquivo no Ruby (6)

Eu estou tentando criar um novo arquivo e as coisas não parecem estar funcionando como eu esperava deles também. Aqui está o que eu tentei:

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

De acordo com tudo que eu li on-line, todos eles devem funcionar, mas cada um deles me dá isto:

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

Isso acontece a partir do IRB, bem como de um arquivo ruby. o que estou perdendo?


OK, agora me sinto idiota. Os dois primeiros definitivamente não funcionam, mas os outros dois o fazem. Não tenho certeza de como me convenci de que eu havia tentado. Desculpe por desperdiçar o tempo de todos.

Caso isso ajude alguém, isso pode ocorrer quando você está tentando criar um novo arquivo em um diretório que não existe.


Experimentar

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

sem usar o

File.new "out.txt"

Se o objetivo é apenas criar um arquivo, a maneira mais direta que eu vejo é:

 FileUtils.touch "foobar.txt"

Tente usar w+ como o modo de gravação em vez de apenas w :

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

Você também pode usar constantes em vez de seqüências de caracteres para especificar o modo desejado. O benefício é se você fizer um erro de digitação em um nome constante, seu programa irá gerar uma exceção de tempo de execução.

As constantes são File::RDONLY ou File::WRONLY ou File::CREAT . Você também pode combiná-los se quiser.

Descrição completa dos modos de abertura de arquivos em ruby-doc.org


File.new e File.open padrão para o modo de leitura ( 'r' ) como um mecanismo de segurança, para evitar a substituição de um arquivo. Temos que dizer explicitamente ao Ruby para usar o modo de gravação ( 'w' é a maneira mais comum) se formos enviar para o arquivo.

Se o texto a ser produzido for uma string, em vez de escrever:

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

ou pior:

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

Use a write mais sucinta:

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

write tem modos permitidos para que possamos usar 'w' , 'a' , 'r+' se necessário.

open com um bloco é útil se você tiver que calcular a saída em um loop iterativo e quiser deixar o arquivo aberto ao fazer isso. write é útil se você for enviar o conteúdo em uma única explosão e fechar o arquivo.

Veja a documentação para mais informações.





errno