การสร้างไฟล์ชั่วคราวจะทำให้คุณได้ไฟล์เปล่าที่มีชื่อสุ่มภายในระบบปฏิบัติการของคุณ (ระบบปฏิบัติการ) โฟลเดอร์ชั่วคราว
ไฟล์นี้ถูกลบ โดยอัตโนมัติ .
คุณทำสิ่งนี้ใน 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
คลาส!
ตอนนี้ถึงตาคุณฝึกฝนแล้ว
ขอบคุณที่อ่านนะคะ 🙂