Como criar um arquivo no Ruby

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?

Usar:

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

onde suas opções são:

  • r – somente leitura. O arquivo deve existir.
  • w – Crie um arquivo vazio para escrita.
  • a – Anexa a um arquivo. O arquivo é criado se não existir.
  • r+ – Abra um arquivo para atualizar a leitura e a escrita. O arquivo deve existir.
  • w+ – Cria um arquivo vazio para leitura e escrita.
  • a+ – Abra um arquivo para leitura e anexação. O arquivo é criado se não existir.

No seu caso, 'w' é preferível.

OU você poderia ter:

 out_file = File.new("out.txt", "w") #... out_file.puts("write your stuff here") #... out_file.close 

Experimentar

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

sem usar o

 File.new "out.txt" 

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

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

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 os havia experimentado. 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.

O diretório não existe. Certifique-se de que exista como open , não irá criar esses diretórios para você.

Eu me deparei com isso um tempo atrás.

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 exportar 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 explosão e fechar o arquivo.

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

Você também pode usar constantes em vez de strings 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