Criando um arquivo vazio em Ruby: equivalente a “toque”?

119

Qual é a melhor maneira de criar um arquivo vazio em Ruby?

Algo semelhante ao comando Unix, toque em :

touch file.txt
Abhi Beckert
fonte
5
Você sempre pode fazer`touch file.txt`
Mark Thomas
8
@Mark: mesmo no windows?
Marc-André Lafortune
1
Pessoas que se preocupam com a programação independente de plataforma adequada? :-)
TJ Biddle

Respostas:

181

FileUtils.touchparece o que faz e espelha * o touchcomando:

require 'fileutils'
FileUtils.touch('file.txt')

* Ao contrário do touch (1), você não pode atualizar mtime ou atime sozinho. Também está faltando algumas outras opções interessantes.

Dave Newton
fonte
@ 5chdn Você quer dizer sem os parênteses? Sim, os parênteses em torno dos parâmetros do método são (às vezes) opcionais.
Dave Newton
44

Se você está preocupado com os identificadores de arquivo:

File.open("foo.txt", "w") {}

Dos documentos :

Se o bloco de código opcional for fornecido, ele receberá o arquivo aberto como um argumento e o objeto File será fechado automaticamente quando o bloco terminar.

Michael Kohl
fonte
Obrigado, estou enviando o novo arquivo para outro processo, portanto, o identificador precisa ser fechado imediatamente.
Abhi Beckert
12
Vale a pena ressaltar que isso na verdade não espelha touch- ele sobrescreverá o arquivo se ele existir.
Mr TheWalrus
3
Use o modo anexar e o arquivo não será truncado se já existir File.open ("foo.txt", "a") {} Isso também não reflete 'touch', mas 'touch (1)' não era a questão.
G. Allen Morris III
Usar "a" não atualiza o mtime. ("toque" era o subtítulo, então o Google nos traz pessoas que querem um toque Ruby.)
Martin Dorey
em sistemas * nix, quem é o proprietário do arquivo quando ele é criado dessa forma?
Islam Azab
24

No Ruby 1.9.3+, você pode usar File.write(também conhecido como IO.write):

File.write("foo.txt", "")

Para a versão anterior, require "backports/1.9.3/file/write"ou useFile.open("foo.txt", "w") {}

Marc-André Lafortune
fonte
Isso é muito mais limpo, mas infelizmente preciso ser compatível com as versões anteriores. Vou manter isso em mente para uso futuro.
Abhi Beckert
2

E também, menos vantajoso, mas muito breve:

`touch file.txt`
Boris Stitnicky
fonte
3
Bifurcará preços separados, então é muito lento.
denis.peplin de
E já está mencionado nos comentários, que não tinha percebido antes.
Boris Stitnicky de
-1

Apenas um exemplo:

File.open "foo.txt", "w"
WarHog
fonte
1
Isso deixa um identificador de arquivo aberto para trás, como faria em alguns outros idiomas?
Abhi Beckert
4
@Abhi: Sim, mas a coleta de lixo cuidará disso em algum momento. Para evitar isso, porém, passe um bloco vazio (ver a resposta de Michael Kohl)
Marc-André Lafortune
Quando "em algum ponto" vai acontecer? No final do script ou imediatamente porque não foi atribuído a nenhuma variável? Estou criando o arquivo para que outros processos no sistema possam começar a trabalhar com ele imediatamente, e eles serão bloqueados se o identificador de arquivo ainda estiver aberto para gravação.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () resolve o problema de manipulação de arquivos, mas FileUtils.touch é uma solução melhor.
Michael Campbell
Não deixe os identificadores de arquivos abertos assim :-)
sekmo