การสร้างไฟล์เปล่าใน Ruby: เทียบเท่า "touch" หรือไม่


119

วิธีที่ดีที่สุดในการสร้างไฟล์เปล่าใน Ruby คืออะไร?

สิ่งที่คล้ายกับคำสั่ง Unix ให้แตะ :

touch file.txt

5
คุณสามารถทำได้เสมอ`touch file.txt`
Mark Thomas

8
@ มาร์ค: แม้แต่บน windows?
Marc-André Lafortune

1
ผู้ที่สนใจเกี่ยวกับการเขียนโปรแกรมโดยไม่ขึ้นกับแพลตฟอร์มที่เหมาะสม? :-)
TJ Biddle

คำตอบ:


181

FileUtils.touchดูเหมือนว่าสิ่งที่มันไม่และกระจก*touchสั่ง:

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

* ไม่เหมือนกับการสัมผัส (1)คุณไม่สามารถอัปเดต mtime หรือ atime เพียงอย่างเดียวได้ นอกจากนี้ยังขาดตัวเลือกที่ดีอื่น ๆ อีกเล็กน้อย


@ 5chdn คุณหมายถึงไม่มี parens? ใช่ parens รอบ ๆ พารามิเตอร์วิธี (บางครั้ง) เป็นทางเลือก
Dave Newton

44

หากคุณกังวลเกี่ยวกับการจัดการไฟล์:

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

จากเอกสาร :

หากกำหนดบล็อกโค้ดที่เป็นทางเลือกจะถูกส่งผ่านไฟล์ที่เปิดเป็นอาร์กิวเมนต์และอ็อบเจ็กต์ไฟล์จะถูกปิดโดยอัตโนมัติเมื่อบล็อกสิ้นสุดลง


ขอบคุณฉันกำลังส่งไฟล์ใหม่ไปยังกระบวนการอื่นดังนั้นจึงต้องปิดหมายเลขอ้างอิงทันที
Abhi Beckert

12
ควรค่าแก่การชี้ให้เห็นว่าสิ่งนี้ไม่ได้สะท้อนจริงtouchแต่จะเขียนทับไฟล์หากมีอยู่
MrTheWalrus

3
ใช้โหมดต่อท้ายและไฟล์จะไม่ถูกตัดทอนหากมีอยู่แล้ว File.open ("foo.txt", "a") {} สิ่งนี้ไม่สะท้อน 'touch' ด้วย แต่ 'touch (1)' ไม่ได้ คำถาม.
G.Alen Morris III

การใช้ "a" จะไม่อัปเดต mtime ("สัมผัส" เป็นคำบรรยาย Google จึงนำผู้ที่ต้องการสัมผัสทับทิมมาให้เรา)
Martin Dorey

บนระบบ * nix ใครเป็นเจ้าของไฟล์เมื่อสร้างด้วยวิธีนี้
Islam Azab

24

ใน Ruby 1.9.3+ คุณสามารถใช้File.write(aka IO.write):

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

สำหรับเวอร์ชันก่อนหน้าrequire "backports/1.9.3/file/write"หรือใช้File.open("foo.txt", "w") {}


สะอาดกว่ามาก แต่น่าเสียดายที่ฉันต้องเข้ากันได้แบบย้อนกลับ ฉันจะเก็บไว้ในใจเพื่อใช้ในอนาคต
Abhi Beckert

2

และข้อได้เปรียบน้อยกว่า แต่สั้นมาก:

`touch file.txt`

3
จะแยกราคาจึงช้ามาก
denis.peplin

และมีการกล่าวถึงแล้วในความคิดเห็นซึ่งฉันไม่ได้สังเกตเห็นก่อนหน้านี้
Boris Stitnicky

-1

เพียงตัวอย่าง:

File.open "foo.txt", "w"

1
สิ่งนี้ทำให้ไฟล์ที่เปิดอยู่ข้างหลังเหมือนในภาษาอื่น ๆ หรือไม่?
Abhi Beckert

4
@ Abhi: ทำได้ แต่การเก็บขยะจะจัดการได้ในบางจุด เพื่อหลีกเลี่ยงสิ่งนั้นให้ผ่านบล็อกที่ว่างเปล่า (ดูคำตอบของ Michael Kohl)
Marc-André Lafortune

"ณ จุดใดจุดหนึ่ง" จะเกิดขึ้นเมื่อใด ในตอนท้ายของสคริปต์หรือทันทีเพราะยังไม่ได้กำหนดให้กับตัวแปรใด ๆ ? ฉันกำลังสร้างไฟล์เพื่อให้กระบวนการอื่น ๆ ในระบบสามารถเริ่มทำงานกับมันได้ทันทีและจะถูกบล็อกหากที่จับไฟล์ยังเปิดอยู่สำหรับการเขียน
Abhi Beckert

1
File.open ("foo.txt", "w") ปิด () แก้ปัญหา filehandle ได้ แต่ FileUtils.touch เป็นทางออกที่ดีกว่า
Michael Campbell

อย่าปล่อยให้ไฟล์ที่เปิดอยู่จัดการแบบนั้น :-)
sekmo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.