Membuat file kosong di Ruby: setara "touch"?

119

Apa cara terbaik untuk membuat file kosong di Ruby?

Sesuatu yang mirip dengan perintah Unix, sentuh :

touch file.txt
Abhi Beckert
sumber
5
Anda selalu dapat melakukannya`touch file.txt`
Mark Thomas
8
@ Mark: bahkan di windows?
Marc-André Lafortune
1
Orang yang peduli dengan pemrograman independen platform yang tepat? :-)
TJ Biddle

Jawaban:

181

FileUtils.touchterlihat seperti apa yang dilakukannya, dan cermin * yang touchperintah:

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

* Tidak seperti touch (1) Anda tidak dapat mengupdate mtime atau atime sendirian. Itu juga kehilangan beberapa opsi bagus lainnya.

Dave Newton
sumber
@ 5chdn Maksud Anda tanpa parens? Ya, tanda kurung di sekitar parameter metode (terkadang) opsional.
Dave Newton
44

Jika Anda khawatir tentang pegangan file:

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

Dari dokumen :

Jika blok kode opsional diberikan, itu akan melewati file yang dibuka sebagai argumen, dan objek File akan secara otomatis ditutup ketika blok berakhir.

Michael Kohl
sumber
Terima kasih, saya mengirim file baru ke proses lain, jadi pegangannya harus segera ditutup.
Abhi Beckert
12
Perlu diperhatikan bahwa ini tidak benar-benar mencerminkan touch- ini akan menimpa file jika ada.
MrTheWalrus
3
Gunakan mode tambahkan dan file tidak akan terpotong jika sudah ada File.open ("foo.txt", "a") {} Ini juga tidak mencerminkan 'sentuh', tetapi kemudian 'sentuh (1)' tidak pertanyaan.
G. Allen Morris III
Menggunakan "a" tidak memperbarui mtime. ("touch" adalah subtitle, jadi Google menghadirkan orang-orang yang menginginkan sentuhan Ruby.)
Martin Dorey
pada sistem * nix, Siapakah pemilik file saat dibuat dengan cara ini?
Islam Azab
24

Di Ruby 1.9.3+, Anda dapat menggunakan File.write(alias IO.write):

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

Untuk versi sebelumnya, baik require "backports/1.9.3/file/write"atau gunakanFile.open("foo.txt", "w") {}

Marc-André Lafortune
sumber
Itu jauh lebih bersih, tapi sayangnya saya harus kompatibel ke belakang. Saya akan mengingatnya untuk penggunaan di masa mendatang.
Abhi Beckert
2

Dan juga, kurang menguntungkan, tapi sangat singkat:

`touch file.txt`
Boris Stitnicky
sumber
3
Akan memisahkan pricess, jadi sangat lambat.
denis.peplin
Dan sudah disebutkan di komentar, yang belum saya perhatikan sebelumnya.
Boris Stitnicky
-1

Contoh saja:

File.open "foo.txt", "w"
WarHog
sumber
1
Apakah ini meninggalkan pegangan file yang terbuka, seperti yang terjadi dalam beberapa bahasa lain?
Abhi Beckert
4
@Abhi: Ya, tetapi pengumpulan sampah akan menanganinya di beberapa titik. Untuk menghindarinya, lewati blok kosong (Lihat jawaban Michael Kohl)
Marc-André Lafortune
Kapan "pada suatu saat" akan terjadi? Di akhir skrip, atau langsung karena belum ditetapkan ke variabel apa pun? Saya membuat file agar proses lain di sistem dapat segera mulai bekerja, dan proses tersebut akan diblokir jika pegangan file masih terbuka untuk ditulis.
Abhi Beckert
1
File.open ("foo.txt", "w"). Close () memecahkan masalah filehandle, tetapi FileUtils.touch adalah solusi yang lebih baik.
Michael Campbell
Jangan biarkan file terbuka menangani seperti itu :-)
sekmo