วิธีสร้างไฟล์ใน Ruby


170

ฉันกำลังพยายามสร้างไฟล์ใหม่และสิ่งต่าง ๆ ไม่ทำงานตามที่ฉันคาดหวังไว้เช่นกัน นี่คือสิ่งที่ฉันได้ลอง:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

จากทุกสิ่งที่ฉันได้อ่านทางออนไลน์ทุกคนควรใช้งานได้ แต่ทุกคนในนั้นให้สิ่งนี้กับฉัน:

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

สิ่งนี้เกิดขึ้นจาก IRB รวมถึงสคริปต์ Ruby ฉันพลาดอะไรไป


13
สองคนแรกไม่ควรทำงาน แต่สองคนนั้นมีความหมายเหมือนกันและน่าจะใช้ได้จริง
แอนดรูมาร์แชลล์

@ แอนดรูว์: คุณคิดว่ามีเพียงสองคนแรกที่ถูกลอง?
mu สั้นเกินไป

1
@muistooshort นั่นเป็นข้อสรุปเดียวที่ฉันสามารถทำได้ สิทธิ์ข้อผิดพลาดจะได้โยนไม่Errno::EACCES ENOENT
Andrew Marshall

2
ตกลงตอนนี้ฉันรู้สึกงี่เง่า สองคนแรกไม่ทำงานแน่นอน แต่คนที่สองทำ ไม่แน่ใจว่าฉันเชื่อมั่นในตัวเองว่าฉันได้ลองพวกเขาอย่างไร ขออภัยที่ต้องเสียเวลาของทุกคน
Civatrix

1
@ Civatrix ไม่มีปัญหา บางครั้งเราก็เสียเวลา
Darth Egregious

คำตอบ:


434

ใช้:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

ตัวเลือกของคุณอยู่ที่ไหน:

  • r- อ่านเท่านั้น. ไฟล์จะต้องมีอยู่
  • w - สร้างไฟล์ว่างเปล่าสำหรับการเขียน
  • a - ต่อท้ายไฟล์ไฟล์จะถูกสร้างขึ้นหากไม่มีอยู่
  • r+- เปิดไฟล์สำหรับอัพเดตทั้งการอ่านและการเขียน ไฟล์จะต้องมีอยู่
  • w+ - สร้างไฟล์ว่างสำหรับทั้งการอ่านและการเขียน
  • a+- เปิดไฟล์สำหรับอ่านและต่อท้าย ไฟล์ถูกสร้างขึ้นหากไม่มีอยู่

ในกรณีของคุณ'w'จะดีกว่า

หรือคุณสามารถมี:

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

11
คำตอบที่ดี ทับทิม conevntion เป็นกรณีงูสำหรับชื่อ var เพียงหัวขึ้นสำหรับมือใหม่ ควรมีลักษณะดังนี้outFile out_file
Adam Waite

3
@ AdamWaite ฉันแก้ไขคำตอบตามคำแนะนำ snake_case ของคุณโดยทิ้งความคิดเห็นนี้ไว้สำหรับบริบท
กริช

3
@zanbri - จะเกิดอะไรขึ้นหากฉันไม่ปิดไฟล์
Erran Morad

1
คำตอบที่ยอดเยี่ยมครอบคลุมและย่อ
บอริส

2
@BoratSagdiyev "วัตถุไฟล์ที่ไม่มีการอ้างอิงอีกต่อไปจะได้รับสิทธิ์ในการรวบรวมขยะไฟล์จะถูกปิดโดยอัตโนมัติเมื่อวัตถุไฟล์เป็นขยะที่เก็บรวบรวม" rootr.net/rubyfaq-9.html
jkdev

35

ลอง

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

โดยไม่ต้องใช้

File.new "out.txt"

25

ลองใช้"w+"เป็นโหมดเขียนแทนเพียง"w":

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

4
ขึ้นอยู่กับว่าคุณต้องการเขียนเท่านั้น ( w) หรือทั้งอ่านและเขียน ( w+)
jkdev

20

ตกลงตอนนี้ฉันรู้สึกงี่เง่า สองคนแรกไม่ทำงานแน่นอน แต่คนที่สองทำ ไม่แน่ใจว่าฉันเชื่อมั่นในตัวเองว่าฉันได้ลองพวกเขาอย่างไร ขออภัยที่ต้องเสียเวลาของทุกคน

ในกรณีนี้ช่วยคนอื่นสิ่งนี้อาจเกิดขึ้นเมื่อคุณพยายามสร้างไฟล์ใหม่ในไดเรกทอรีที่ไม่มีอยู่


11

ไม่มีไดเรกทอรี ตรวจสอบให้แน่ใจว่ามีอยู่เพราะopenจะไม่สร้าง dirs เหล่านั้นให้คุณ

ฉันวิ่งเข้าไปหาตัวเองซักพักนึง


11

File.newและFile.openโหมดการอ่านค่าเริ่มต้น ( 'r') เป็นกลไกความปลอดภัยเพื่อหลีกเลี่ยงการเขียนทับไฟล์ เราต้องบอก Ruby ให้ใช้โหมดการเขียนอย่างชัดเจน ( 'w'เป็นวิธีที่พบได้บ่อยที่สุด) หากเราจะส่งออกไปยังไฟล์

หากข้อความที่จะส่งออกเป็นสตริงแทนที่จะเขียน:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

หรือแย่กว่านั้น:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

ใช้รวบรัดมากขึ้นwrite:

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

writeมีโหมดที่ได้รับอนุญาตเพื่อให้เราสามารถใช้'w', 'a', 'r+'ในกรณีที่จำเป็น

openด้วยบล็อกจะมีประโยชน์ถ้าคุณต้องคำนวณผลลัพธ์ในลูปวนซ้ำและต้องการเปิดไฟล์ทิ้งไว้ในขณะที่คุณทำเช่นนั้น writeมีประโยชน์ถ้าคุณกำลังจะส่งออกเนื้อหาในหนึ่งระเบิดแล้วปิดไฟล์

ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม


การตอบสนองที่ยอดเยี่ยมนี่เป็นสำนวนที่สุดและเป็นวิธี "รูบิสต์" ควรเป็นคำตอบที่ดีที่สุด
Gino

ฉันเห็นด้วย ฉันไม่ค่อยใช้รูปแบบบล็อกเพื่อเขียนไฟล์ มันมีเสียงดังมากเกินไป
Tin Man

11

หากวัตถุประสงค์เพียงเพื่อสร้างไฟล์วิธีที่ตรงที่สุดที่ฉันเห็นคือ:

 FileUtils.touch "foobar.txt"


0

คุณยังสามารถใช้ค่าคงที่แทนสตริงเพื่อระบุโหมดที่คุณต้องการ ประโยชน์คือถ้าคุณพิมพ์ผิดในชื่อคงที่โปรแกรมของคุณจะเพิ่มข้อยกเว้นรันไทม์

คงมีFile::RDONLYหรือหรือFile::WRONLY File::CREATคุณสามารถรวมพวกเขาหากคุณต้องการ

คำอธิบายแบบเต็มของโหมดเปิดไฟล์ใน ruby-doc.org

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