Como criar um arquivo no Ruby


170

Estou tentando criar um novo arquivo e as coisas não parecem funcionar como eu espero. 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 li online, todos devem funcionar, mas cada um deles me fornece o seguinte:

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

Isso acontece no IRB e também em um script Ruby. o que estou perdendo?


13
Os dois primeiros não devem funcionar, mas os dois segundos são sinônimos e definitivamente devem funcionar.
Andrew Marshall

@ Andrew: Você está pensando que apenas os dois primeiros foram julgados?
mu é muito curto

1
@muistooshort Essa é a única conclusão que posso chegar. Um erro de permissão teria gerado Errno::EACCES, não ENOENT.
Andrew Marshall

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

1
@Civatrix Isso não é problema. Às vezes, todos nós perdemos tempo.
Darth Egrégio

Respostas:


434

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 escrever.
  • a - Anexar a um arquivo. O arquivo é criado se ele não existir.
  • r+- Abra um arquivo para atualizar a leitura e a gravação. O arquivo deve existir.
  • w+ - Crie um arquivo vazio para leitura e gravação.
  • a+- Abra um arquivo para ler e anexar. O arquivo é criado se não existir.

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

OU você pode ter:

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

11
Ótima resposta. A configuração Ruby é um caso de cobra para nomes de var. Apenas um alerta para iniciantes. outFiledeve parecer out_file.
Adam Waite

3
@AdamWaite Editei a resposta conforme sua sugestão de snake_case, deixando esse comentário para o contexto.
Kris

3
@zanbri - o que acontece se eu não fechar o arquivo?
Erran Morad 27/09/14

1
ótima resposta, abrangente e breve
Boris

2
@BoratSagdiyev "Um objeto File que não é mais referenciado torna-se elegível para coleta de lixo. O arquivo será fechado automaticamente quando o objeto File for coletado de lixo." rootr.net/rubyfaq-9.html
jkdev

35

Experimentar

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

sem usar o

File.new "out.txt"

25

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

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

4
Depende se você deseja escrever apenas ( w) ou ler e escrever ( w+).
Jkdev

20

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

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


11

O diretório não existe. Verifique se ele existe, pois opennão criará esses diretórios para você.

Eu me deparei com isso um tempo atrás.


11

File.newe o File.openpadrão para o modo de leitura ( 'r') como um mecanismo de segurança, para evitar a possibilidade de sobrescrever um arquivo. Temos que dizer explicitamente ao Ruby para usar o modo de gravação ( 'w'é a maneira mais comum) se quisermos produzir o arquivo.

Se o texto a ser produzido for uma sequência, 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 o mais sucinto write:

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

writetem modos permitido para que possamos utilizar 'w', 'a', 'r+'se necessário.

opencom um bloco é útil se você precisar calcular a saída em um loop iterativo e desejar deixar o arquivo aberto enquanto o faz. writeé útil se você quiser exibir o conteúdo de uma só vez e feche o arquivo.

Consulte a documentação para obter mais informações.


Ótima resposta, esse é o caminho mais idiomático e, portanto, o "rubiista". Deve ser a melhor resposta.
Gino

Bem, eu concordo. Eu raramente uso o formulário de bloco para gravar arquivos. É muito visualmente barulhento.
the Tin Man

11

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

 FileUtils.touch "foobar.txt"

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

Você pode usar File.write('name of file here', data)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.