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

ฟังก์ชั่นในตัว

นี่คือฟังก์ชั่นในตัวของทับทิมเพื่อประมวลผลไฟล์และไดเร็กทอรี -

  • แฟ้มคลาและวิธีการ

  • ผบ. ชั้นและวิธีการ