Ruby - ไฟล์ I / O
Ruby จัดเตรียมวิธีการที่เกี่ยวข้องกับ I / O ทั้งหมดที่ใช้ในโมดูลเคอร์เนล เมธอด I / O ทั้งหมดมาจากคลาส IO
ชั้นIOให้ทุกวิธีการขั้นพื้นฐานเช่นการอ่านเขียนได้รับทำให้, ReadLine, GETC,และprintf
บทนี้จะกล่าวถึงฟังก์ชัน I / O พื้นฐานทั้งหมดที่มีใน Ruby สำหรับฟังก์ชั่นเพิ่มเติมโปรดดูที่ชั้นทับทิมIO
ทำให้งบ
ในบทก่อนหน้านี้คุณได้กำหนดค่าให้กับตัวแปรแล้วพิมพ์ผลลัพธ์โดยใช้คำสั่งputs
ทำให้คำสั่งสั่งให้โปรแกรมที่จะแสดงค่าที่เก็บไว้ในตัวแปร สิ่งนี้จะเพิ่มบรรทัดใหม่ที่ส่วนท้ายของแต่ละบรรทัดที่เขียน
ตัวอย่าง
#!/usr/bin/ruby
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
This is variable one
This is variable two
ได้รับคำชี้แจง
ได้รับคำสั่งที่สามารถใช้ในการป้อนข้อมูลใด ๆ จากผู้ใช้จากหน้าจอมาตรฐานที่เรียกว่า STDIN
ตัวอย่าง
รหัสต่อไปนี้แสดงวิธีใช้คำสั่ง gets รหัสนี้จะแจ้งให้ผู้ใช้ป้อนค่าซึ่งจะถูกเก็บไว้ในตัวแปรวาลและสุดท้ายจะถูกพิมพ์บน STDOUT
#!/usr/bin/ruby
puts "Enter a value :"
val = gets
puts val
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Enter a value :
This is entered value
This is entered value
คำชี้แจง putc
ซึ่งแตกต่างจากคำสั่งputsซึ่งแสดงสตริงทั้งหมดบนหน้าจอคำสั่งputcสามารถใช้เพื่อส่งออกทีละอักขระ
ตัวอย่าง
ผลลัพธ์ของรหัสต่อไปนี้เป็นเพียงอักขระ H -
#!/usr/bin/ruby
str = "Hello Ruby!"
putc str
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
H
คำชี้แจงการพิมพ์
พิมพ์คำสั่งมีความคล้ายคลึงกับทำให้คำสั่ง ข้อแตกต่างเพียงอย่างเดียวคือคำสั่งputsจะไปที่บรรทัดถัดไปหลังจากพิมพ์เนื้อหาในขณะที่คำสั่งพิมพ์เคอร์เซอร์อยู่ในตำแหน่งบนบรรทัดเดียวกัน
ตัวอย่าง
#!/usr/bin/ruby
print "Hello World"
print "Good Morning"
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
Hello WorldGood Morning
การเปิดและปิดไฟล์
จนถึงขณะนี้คุณได้อ่านและเขียนไปยังอินพุตและเอาต์พุตมาตรฐาน ตอนนี้เราจะดูวิธีการเล่นกับไฟล์ข้อมูลจริง
วิธี File.new
คุณสามารถสร้างอ็อบเจ็กต์Fileโดยใช้เมธอดFile.newสำหรับการอ่านเขียนหรือทั้งสองอย่างตามสตริงโหมด สุดท้ายคุณสามารถใช้เมธอดFile.closeเพื่อปิดไฟล์นั้น
ไวยากรณ์
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
วิธี File.open
คุณสามารถใช้เมธอดFile.openเพื่อสร้างอ็อบเจ็กต์ไฟล์ใหม่และกำหนดอ็อบเจ็กต์ไฟล์นั้นให้กับไฟล์ แต่มีหนึ่งความแตกต่างระหว่างFile.openและFile.newวิธี ความแตกต่างคือเมธอดFile.openสามารถเชื่อมโยงกับบล็อกได้ในขณะที่คุณไม่สามารถทำได้โดยใช้เมธอดFile.new
File.open("filename", "mode") do |aFile|
# ... process the file
end
ซีเนียร์ | โหมดและคำอธิบาย |
---|---|
1 | r โหมดอ่านอย่างเดียว ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ นี่คือโหมดเริ่มต้น |
2 | r+ โหมดอ่าน - เขียน ตัวชี้ไฟล์จะอยู่ที่จุดเริ่มต้นของไฟล์ |
3 | w โหมดเขียนอย่างเดียว เขียนทับไฟล์หากมีไฟล์อยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับเขียน |
4 | w+ โหมดอ่าน - เขียน เขียนทับไฟล์ที่มีอยู่ถ้าไฟล์นั้นมีอยู่ หากไม่มีไฟล์ให้สร้างไฟล์ใหม่สำหรับการอ่านและเขียน |
5 | a โหมดเขียนอย่างเดียว ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ นั่นคือไฟล์อยู่ในโหมดผนวก หากไม่มีไฟล์อยู่ระบบจะสร้างไฟล์ใหม่สำหรับการเขียน |
6 | a+ โหมดอ่านและเขียน ตัวชี้ไฟล์จะอยู่ท้ายไฟล์หากไฟล์นั้นมีอยู่ ไฟล์จะเปิดขึ้นในโหมดผนวก หากไม่มีไฟล์อยู่ไฟล์จะสร้างไฟล์ใหม่สำหรับอ่านและเขียน |
การอ่านและเขียนไฟล์
วิธีการเดียวกับที่เราใช้สำหรับ I / O แบบ 'ธรรมดา' นั้นมีให้สำหรับอ็อบเจ็กต์ไฟล์ทั้งหมด ดังนั้นรับอ่านบรรทัดจากอินพุตมาตรฐานและaFile.getsอ่านบรรทัดจากอ็อบเจ็กต์ไฟล์ aFile
อย่างไรก็ตามอ็อบเจ็กต์ I / O มีชุดวิธีการเข้าถึงเพิ่มเติมเพื่อให้ชีวิตของเราง่ายขึ้น
วิธีการ sysread
คุณสามารถใช้เมธอดsysreadเพื่ออ่านเนื้อหาของไฟล์ คุณสามารถเปิดไฟล์ในโหมดใดก็ได้เมื่อใช้วิธี sysread ตัวอย่างเช่น -
ต่อไปนี้เป็นไฟล์ข้อความอินพุต -
This is a simple text file for testing purpose.
ตอนนี้เรามาลองอ่านไฟล์นี้กัน -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r")
if aFile
content = aFile.sysread(20)
puts content
else
puts "Unable to open file!"
end
คำสั่งนี้จะแสดงอักขระ 20 ตัวแรกของไฟล์ ตอนนี้ตัวชี้ไฟล์จะถูกวางไว้ที่อักขระที่ 21 ในไฟล์
วิธี syswrite
คุณสามารถใช้เมธอด syswrite เพื่อเขียนเนื้อหาลงในไฟล์ คุณต้องเปิดไฟล์ในโหมดเขียนเมื่อใช้วิธี syswrite ตัวอย่างเช่น -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
else
puts "Unable to open file!"
end
คำสั่งนี้จะเขียน "ABCDEF" ลงในไฟล์
วิธี each_byte
วิธีการนี้เป็นชั้นไฟล์ วิธีeach_byteเชื่อมโยงกับบล็อกเสมอ พิจารณาตัวอย่างโค้ดต่อไปนี้ -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
aFile.each_byte {|ch| putc ch; putc ?. }
else
puts "Unable to open file!"
end
อักขระจะถูกส่งไปทีละตัวไปยังตัวแปร ch แล้วแสดงบนหน้าจอดังนี้ -
s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.
วิธี IO.readlines
ชั้นไฟล์เป็น subclass ของชั้นเรียน IO คลาส IO ยังมีวิธีการบางอย่างซึ่งสามารถใช้ในการจัดการไฟล์
หนึ่งในวิธีการเรียน IO เป็นIO.readlines วิธีนี้จะส่งคืนเนื้อหาของไฟล์ทีละบรรทัด รหัสต่อไปนี้แสดงการใช้เมธอดIO.readlines -
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
ในรหัสนี้ตัวแปร arr คืออาร์เรย์ แต่ละบรรทัดของไฟล์input.txtจะเป็นองค์ประกอบในอาร์เรย์ arr ดังนั้น arr [0] จะมีบรรทัดแรกในขณะที่ arr [1] จะมีบรรทัดที่สองของไฟล์
วิธี IO.foreach
วิธีนี้ยังส่งคืนผลลัพธ์ทีละบรรทัด ความแตกต่างระหว่าง method foreachและ method readlinesคือ method foreachนั้นเชื่อมโยงกับ block แต่แตกต่างจากวิธีการreadline จะวิธีการforeachไม่กลับอาร์เรย์ ตัวอย่างเช่น -
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
รหัสนี้จะส่งผ่านเนื้อหาของไฟล์ทดสอบทีละบรรทัดไปยังบล็อกตัวแปรจากนั้นผลลัพธ์จะแสดงบนหน้าจอ
การเปลี่ยนชื่อและการลบไฟล์
คุณสามารถเปลี่ยนชื่อและลบไฟล์โปรแกรมทับทิมกับการเปลี่ยนชื่อและลบวิธี
ต่อไปนี้เป็นตัวอย่างการเปลี่ยนชื่อไฟล์ที่มีอยู่test1.txt -
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )
ต่อไปนี้เป็นตัวอย่างในการลบไฟล์test2.txtที่มีอยู่-
#!/usr/bin/ruby
# Delete file test2.txt
File.delete("test2.txt")
โหมดไฟล์และความเป็นเจ้าของ
ใช้วิธีการchmodด้วยหน้ากากเพื่อเปลี่ยนโหมดหรือสิทธิ์ / รายการเข้าถึงไฟล์ -
ต่อไปนี้เป็นตัวอย่างการเปลี่ยนโหมดของไฟล์test.txtที่มีอยู่เป็นค่ามาสก์ -
#!/usr/bin/ruby
file = File.new( "test.txt", "w" )
file.chmod( 0755 )
ซีเนียร์ | หน้ากากและคำอธิบาย |
---|---|
1 | 0700 rwx mask สำหรับเจ้าของ |
2 | 0400 r สำหรับเจ้าของ |
3 | 0200 w สำหรับเจ้าของ |
4 | 0100 x สำหรับเจ้าของ |
5 | 0070 rwx mask สำหรับกลุ่ม |
6 | 0040 r สำหรับกลุ่ม |
7 | 0020 w สำหรับกลุ่ม |
8 | 0010 x สำหรับกลุ่ม |
9 | 0007 rwx mask สำหรับอื่น ๆ |
10 | 0004 r สำหรับอื่น ๆ |
11 | 0002 w สำหรับอื่น ๆ |
12 | 0001 x สำหรับอื่น ๆ |
13 | 4000 ตั้งค่า ID ผู้ใช้ในการดำเนินการ |
14 | 2000 ตั้งรหัสกลุ่มในการดำเนินการ |
15 | 1000 บันทึกข้อความที่สลับแม้หลังจากใช้งานแล้ว |
คำถามเกี่ยวกับไฟล์
คำสั่งต่อไปนี้จะทดสอบว่ามีไฟล์อยู่หรือไม่ก่อนเปิด -
#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )
คำสั่งต่อไปนี้สอบถามว่าไฟล์นั้นเป็นไฟล์จริงหรือไม่ -
#!/usr/bin/ruby
# This returns either true or false
File.file?( "text.txt" )
คำสั่งต่อไปนี้ค้นหาว่าชื่อไฟล์ที่กำหนดเป็นไดเร็กทอรีหรือไม่ -
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
File::directory?( "file.rb" ) # => false
คำสั่งต่อไปนี้ค้นหาว่าไฟล์สามารถอ่านเขียนได้หรือปฏิบัติการได้ -
#!/usr/bin/ruby
File.readable?( "test.txt" ) # => true
File.writable?( "test.txt" ) # => true
File.executable?( "test.txt" ) # => false
คำสั่งต่อไปนี้ค้นหาว่าไฟล์มีขนาดเป็นศูนย์หรือไม่ -
#!/usr/bin/ruby
File.zero?( "test.txt" ) # => true
คำสั่งต่อไปนี้ส่งคืนขนาดของไฟล์ -
#!/usr/bin/ruby
File.size?( "text.txt" ) # => 1002
คำสั่งต่อไปนี้สามารถใช้เพื่อค้นหาประเภทของไฟล์ -
#!/usr/bin/ruby
File::ftype( "test.txt" ) # => file
เมธอด ftype ระบุชนิดของไฟล์โดยการส่งคืนหนึ่งในไฟล์ต่อไปนี้ - file, directory, characterSpecial, blockSpecial, fifo, link, socket หรือ Unknown
คำสั่งต่อไปนี้สามารถใช้เพื่อค้นหาเมื่อไฟล์ถูกสร้างแก้ไขหรือเข้าถึงครั้งล่าสุด -
#!/usr/bin/ruby
File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008
ไดเรกทอรีใน Ruby
ไฟล์ทั้งหมดอยู่ในไดเร็กทอรีต่างๆและ Ruby ก็ไม่มีปัญหาในการจัดการไฟล์เหล่านี้ด้วย ในขณะที่คลาสFileจัดการไฟล์ไดเร็กทอรีจะถูกจัดการด้วยคลาสDir
การนำทางผ่านไดเรกทอรี
ในการเปลี่ยนไดเร็กทอรีภายในโปรแกรม Ruby ให้ใช้Dir.chdirดังนี้ ตัวอย่างเช่นนี้จะเปลี่ยนไดเรกทอรีปัจจุบันไปยัง/ usr / bin
Dir.chdir("/usr/bin")
คุณสามารถค้นหาไดเร็กทอรีปัจจุบันด้วยDir.pwd -
puts Dir.pwd # This will return something like /usr/bin
คุณสามารถรับรายชื่อไฟล์และไดเร็กทอรีภายในไดเร็กทอรีเฉพาะโดยใช้Dir.entries -
puts Dir.entries("/usr/bin").join(' ')
Dir.entriesส่งคืนอาร์เรย์ที่มีรายการทั้งหมดภายในไดเร็กทอรีที่ระบุ Dir.foreachให้คุณสมบัติเดียวกัน -
Dir.foreach("/usr/bin") do |entry|
puts entry
end
วิธีที่กระชับยิ่งขึ้นในการรับรายชื่อไดเร็กทอรีคือการใช้วิธีคลาสอาร์เรย์ของ Dir -
Dir["/usr/bin/*"]
การสร้างไดเร็กทอรี
Dir.mkdirสามารถใช้ในการสร้างไดเรกทอรี -
Dir.mkdir("mynewdir")
คุณยังสามารถตั้งค่าการอนุญาตในไดเรกทอรีใหม่ (ไม่ใช่ที่มีอยู่แล้ว) ด้วย mkdir -
NOTE - มาสก์ 755 ตั้งค่าสิทธิ์เจ้าของ, กลุ่ม, โลก [ทุกคน] เป็น rwxr-xr-x โดยที่ r = อ่าน, w = เขียนและ x = ดำเนินการ
Dir.mkdir( "mynewdir", 755 )
การลบไดเรกทอรี
Dir.deleteสามารถใช้ในการลบไดเรกทอรี Dir.unlinkและDir.rmdirดำเนินการตรงฟังก์ชั่นเหมือนกันและเพื่อความสะดวกสบาย
Dir.delete("testdir")
การสร้างไฟล์และไดเรกทอรีชั่วคราว
ไฟล์ชั่วคราวคือไฟล์ที่อาจสร้างขึ้นในช่วงสั้น ๆ ระหว่างการทำงานของโปรแกรม แต่ไม่ใช่ที่เก็บข้อมูลถาวร
Dir.tmpdirจัดเตรียมพา ธ ไปยังไดเร็กทอรีชั่วคราวบนระบบปัจจุบันแม้ว่าเมธอดจะไม่พร้อมใช้งานตามค่าเริ่มต้น เพื่อให้Dir.tmpdirพร้อมใช้งานจำเป็นต้องใช้ต้องใช้ 'tmpdir'
คุณสามารถใช้Dir.tmpdirกับFile.joinเพื่อสร้างไฟล์ชั่วคราวที่ไม่ขึ้นกับแพลตฟอร์ม -
require 'tmpdir'
tempfilename = File.join(Dir.tmpdir, "tingtong")
tempfile = File.new(tempfilename, "w")
tempfile.puts "This is a temporary file"
tempfile.close
File.delete(tempfilename)
รหัสนี้สร้างไฟล์ชั่วคราวเขียนข้อมูลและลบออก ไลบรารีมาตรฐานของ Ruby ยังมีไลบรารีชื่อTempfileที่สามารถสร้างไฟล์ชั่วคราวให้คุณได้ -
require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close
ฟังก์ชั่นในตัว
นี่คือฟังก์ชั่นในตัวของทับทิมเพื่อประมวลผลไฟล์และไดเร็กทอรี -
แฟ้มคลาและวิธีการ
ผบ. ชั้นและวิธีการ