Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

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

การสร้างไฟล์ชั่วคราวจะทำให้คุณได้ไฟล์เปล่าที่มีชื่อสุ่มภายในระบบปฏิบัติการของคุณ (ระบบปฏิบัติการ) โฟลเดอร์ชั่วคราว

ไฟล์นี้ถูกลบ โดยอัตโนมัติ .

คุณทำสิ่งนี้ใน Ruby ได้อย่างไร

ถูกใจสิ่งนี้ :

require 'tempfile'

Tempfile.create { |f| f << "abc\n" }

โดยที่ f เป็นไฟล์ของคุณ &<< เขียนถึงมัน

สิ่งนี้มีอยู่ใน Ruby คุณจึงไม่ต้องติดตั้งอัญมณีใดๆ

ได้เลย

ง่ายพอ แต่คุณอาจยังมีข้อสงสัย

ถูกใจ :

  • ไฟล์จะถูกลบเมื่อใด
  • ทำไมฉันจึงไม่สามารถอ่านกลับจากไฟล์ temp ของฉันได้
  • รับประกันว่า tempfiles จะไม่ซ้ำกันหรือไม่

ฉันจะตอบคำถามเหล่านี้และอีกสองสามข้อเพื่อให้คุณได้พัฒนาความเข้าใจที่ลึกซึ้งยิ่งขึ้น!

อะไรคือความแตกต่างระหว่างสิ่งใหม่และการสร้าง

คุณจะสังเกตเห็นว่า Tempfile มีสองวิธีในการสร้างไฟล์

หนึ่งคือ new และอีกอันคือ create .

ต่างกันอย่างไร

ตามเอกสาร new สร้าง Tempfile วัตถุ (อย่างที่คุณคาดหวัง) แต่ create ให้ File วัตถุ

ฉันไม่คิดว่ามันสำคัญหรอก เพราะ Tempfile มอบหมายให้ File .

ความแตกต่างที่แท้จริงคือ create ยอมรับการบล็อก

แต่ new ไม่ได้

ลองสิ่งนี้ :

Tempfile.new {}

คุณจะได้รับคำเตือนที่เป็นประโยชน์นี้ :

# warning: Tempfile.new doesn't call the given block.

คุณสามารถใช้บล็อกที่มี create เพื่อให้แน่ใจว่าไฟล์ชั่วคราวของคุณจะถูกลบหลังจากการบล็อกสิ้นสุดลง

สิ่งนี้ทำให้เกิดคำถามต่อไปนี้…

TempFile จะถูกลบเมื่อใด

คุณสามารถควบคุมได้ว่าเมื่อใดที่ไฟล์จะถูกลบ โดยการลบมันเองเหมือนไฟล์ปกติ (delete เมธอด) หรือใช้ create ด้วยบล็อก

การลบอัตโนมัติทำงานเมื่อ :

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

ภายหลังสามารถเกิดขึ้นได้ก็ต่อเมื่อคุณไม่มีการอ้างอิงถึงไฟล์

เหมือนเป็นตัวแปร

นี่คือสิ่งที่ฉันหมายถึง :

t = Tempfile.new

เมื่อ t อยู่นอกขอบเขต จึงสามารถลบไฟล์ชั่วคราวได้

หากคุณใช้ Linux เครื่องมือที่น่าสนใจมากในการดูว่าไฟล์ใดกำลังสร้างและลบในแบบเรียลไทม์คือ inotify-tools

ลองใช้คำสั่งนี้ :

inotifywait /tmp -m --format "%w %e %f %T" --timefmt "%H:%m:%S"

จากนั้นรันโค้ด Ruby ที่สร้างไฟล์

ตัวอย่าง :

ruby -rtempfile -e "def c; t = Tempfile.new('testing'); end; c; sleep 10"

คุณจะเห็นสิ่งนี้ :

/tmp/ CREATE testing20190506-11391-1wqcng0 14:51:48
/tmp/ OPEN testing20190506-11391-1wqcng0 14:51:48
/tmp/ CLOSE_WRITE,CLOSE testing20190506-11391-1wqcng0 14:51:58
/tmp/ DELETE testing20190506-11391-1wqcng0 14:51:58

ทำไมคุณอ่านกลับจากไฟล์ชั่วคราวไม่ได้

หากคุณพยายามอ่านกลับจากไฟล์ชั่วคราวของคุณ คุณจะได้รับสตริงว่าง

ตัวอย่าง :

Tempfile.create { |f| f << "abc\n"; f.read }
# ""

ทำไมถึงเป็นเช่นนั้น?

ปรากฎว่า Files คือ IO วัตถุ

ออบเจ็กต์ IO มี ตัวชี้ตำแหน่ง &เมื่อคุณเขียนถึงไฟล์ตำแหน่งนี้จะก้าวหน้า

ดังนั้นหากต้องการอ่าน คุณต้องกรอกลับตัวชี้นี้

ถูกใจสิ่งนี้ :

Tempfile.create { |f| f << "abc\n"; f.rewind; f.read }
# "abc\n"

คุณอาจต้องล้างเนื้อหาในไฟล์ด้วย

ตัวอย่าง :

temp = Tempfile.new

temp << "1"
temp << "2"

temp.flush

Tempfiles มีความพิเศษเฉพาะหรือไม่

Tempfile สร้างชื่อไฟล์ที่ไม่ซ้ำกันและตั้งค่าโหมดการอนุญาตเป็น 600 ซึ่งหมายความว่าเฉพาะผู้ใช้ที่สร้างไฟล์นี้เท่านั้นที่สามารถอ่านได้

แต่จะมีชื่อซ้ำกันได้หรือเปล่า

เอกสารระบุสิ่งนี้ :

“วิธีการเลือกชื่อไฟล์ของ Tempfile มีทั้งแบบปลอดภัยต่อเธรดและระหว่างกระบวนการ:รับประกันว่าจะไม่มีเธรดหรือกระบวนการอื่นใดที่จะเลือกชื่อไฟล์เดียวกัน”

และคำอธิบายสำหรับ new ยังบอกด้วยว่าอาจก่อให้เกิดข้อผิดพลาดหากไม่พบชื่อไฟล์ที่ไม่ซ้ำกัน

นอกจากนี้ คุณยังตั้งค่าคำนำหน้าสำหรับไฟล์ได้ด้วย

ถูกใจสิ่งนี้ :

Tempfile.new("banana-").path
# "/tmp/banana-20190426-25403-1cm7sjt"

ซึ่งจะช่วยลดความเป็นไปได้ที่ชื่อจะชนกัน

การเปิดไฟล์ชั่วคราวในโหมดไบนารี

หากคุณกำลังทำงานกับรูปภาพ เพลง หรือสิ่งอื่นที่ไม่ใช่ข้อความธรรมดา คุณอาจต้องตั้งค่าโหมดไฟล์เป็นไบนารี

โหมดไฟล์ไบนารีจะหยุดการแปลงบรรทัดสิ้นสุด

ด้วยเหตุนี้ ข้อมูลจะเป็นแบบ "ดิบ" มากกว่า และคุณจะหลีกเลี่ยงการทำลายส่วนต่างๆ ของไฟล์ไบนารี

โหมดไบนารีไม่ได้เปิดใช้งานโดยค่าเริ่มต้น :

temp = Tempfile.new

temp.binmode?
# false

คุณสามารถเปิดใช้งานได้เช่นนี้ :

temp = Tempfile.new
temp.binmode

temp.binmode?
# true

นอกจากนี้ยังใช้ได้กับ create วิธีการ:

Tempfile.create do |f|
  f.binmode

  f << "bacon\n"
end

สรุป

คุณได้เรียนรู้เกี่ยวกับไฟล์ชั่วคราวใน Ruby โดยใช้ Tempfile คลาส!

ตอนนี้ถึงตาคุณฝึกฝนแล้ว

ขอบคุณที่อ่านนะคะ 🙂