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?

Civatrix
fonte
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
zanbri
fonte
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"
GMD
fonte
25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
fonte
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.

tom
fonte
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.

nterry
fonte
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.

o homem de lata
fonte
Ó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"
Nicola Mingotti
fonte
1
data = 'data you want inside the file'.

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

ispirett
fonte
0

Você também pode usar constantes em vez de cadeias para especificar o modo desejado. O benefício é que, se você digitar um nome de erro constante, seu programa gerará uma exceção de tempo de execução.

As constantes são File::RDONLYou File::WRONLYou File::CREAT. Você também pode combiná-los, se quiser.

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

Alex Tamoykin
fonte