Ruby - Tệp I / O
Ruby cung cấp một tập hợp toàn bộ các phương thức liên quan đến I / O được triển khai trong mô-đun Kernel. Tất cả các phương thức I / O đều bắt nguồn từ lớp IO.
Lớp IO cung cấp tất cả các phương thức cơ bản, chẳng hạn như đọc, viết, được, đặt, readline, getc và printf .
Chương này sẽ trình bày tất cả các chức năng I / O cơ bản có trong Ruby. Để biết thêm các chức năng, vui lòng tham khảo Ruby Class IO .
Tuyên bố đặt
Trong các chương trước, bạn đã gán giá trị cho các biến và sau đó in đầu ra bằng câu lệnh put .
Câu lệnh put hướng dẫn chương trình hiển thị giá trị được lưu trữ trong biến. Thao tác này sẽ thêm một dòng mới vào cuối mỗi dòng mà nó viết.
Thí dụ
#!/usr/bin/ruby
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2
Điều này sẽ tạo ra kết quả sau:
This is variable one
This is variable two
Tuyên bố được
Các bị cáo có thể được sử dụng để lấy bất kỳ đầu vào từ người sử dụng từ màn hình tiêu chuẩn gọi là STDIN.
Thí dụ
Đoạn mã sau đây cho bạn biết cách sử dụng câu lệnh get. Mã này sẽ nhắc người dùng nhập một giá trị, giá trị này sẽ được lưu trữ trong một biến val và cuối cùng sẽ được in trên STDOUT.
#!/usr/bin/ruby
puts "Enter a value :"
val = gets
puts val
Điều này sẽ tạo ra kết quả sau:
Enter a value :
This is entered value
This is entered value
Câu lệnh putc
Không giống như câu lệnh put xuất toàn bộ chuỗi ra màn hình, câu lệnh putc có thể được sử dụng để xuất một ký tự tại một thời điểm.
Thí dụ
Đầu ra của đoạn mã sau chỉ là ký tự H -
#!/usr/bin/ruby
str = "Hello Ruby!"
putc str
Điều này sẽ tạo ra kết quả sau:
H
Tuyên bố in
Câu lệnh print tương tự như câu lệnh put . Sự khác biệt duy nhất là câu lệnh put sẽ chuyển đến dòng tiếp theo sau khi in nội dung, trong khi với câu lệnh print , con trỏ được đặt trên cùng một dòng.
Thí dụ
#!/usr/bin/ruby
print "Hello World"
print "Good Morning"
Điều này sẽ tạo ra kết quả sau:
Hello WorldGood Morning
Mở và đóng tệp
Cho đến nay, bạn đã đọc và ghi với đầu vào và đầu ra tiêu chuẩn. Bây giờ, chúng ta sẽ xem cách chơi với các tệp dữ liệu thực tế.
Phương pháp File.new
Bạn có thể tạo một đối tượng Tệp bằng cách sử dụng phương thức File.new để đọc, ghi hoặc cả hai, theo chuỗi chế độ. Cuối cùng, bạn có thể sử dụng phương thức File.close để đóng tệp đó.
Cú pháp
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
Phương thức File.open
Bạn có thể sử dụng phương thức File.open để tạo một đối tượng tệp mới và gán đối tượng tệp đó cho một tệp. Tuy nhiên, có một sự khác biệt giữa File.open và File.new phương pháp. Sự khác biệt là phương thức File.open có thể được liên kết với một khối, trong khi bạn không thể làm điều tương tự bằng phương thức File.new .
File.open("filename", "mode") do |aFile|
# ... process the file
end
Sr.No. | Chế độ & Mô tả |
---|---|
1 | r Chế độ chỉ đọc. Con trỏ tệp được đặt ở đầu tệp. Đây là chế độ mặc định. |
2 | r+ Chế độ đọc-ghi. Con trỏ tệp sẽ ở đầu tệp. |
3 | w Chế độ chỉ ghi. Ghi đè tệp nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để ghi. |
4 | w+ Chế độ đọc-ghi. Ghi đè tệp hiện có nếu tệp tồn tại. Nếu tệp không tồn tại, hãy tạo một tệp mới để đọc và ghi. |
5 | a Chế độ chỉ ghi. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tức là, tệp đang ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để ghi. |
6 | a+ Chế độ đọc và ghi. Con trỏ tệp ở cuối tệp nếu tệp tồn tại. Tệp sẽ mở ở chế độ nối thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi. |
Đọc và ghi tệp
Các phương pháp tương tự mà chúng tôi đã sử dụng cho I / O 'đơn giản' có sẵn cho tất cả các đối tượng tệp. Vì vậy, được đọc một dòng từ đầu vào chuẩn và aFile.gets đọc một dòng từ đối tượng tệp aFile.
Tuy nhiên, các đối tượng I / O cung cấp thêm một số phương thức truy cập để giúp cuộc sống của chúng ta dễ dàng hơn.
Phương pháp sysread
Bạn có thể sử dụng phương thức sysread để đọc nội dung của tệp. Bạn có thể mở tệp ở bất kỳ chế độ nào khi sử dụng phương thức sysread. Ví dụ -
Sau đây là tệp văn bản đầu vào -
This is a simple text file for testing purpose.
Bây giờ chúng ta hãy thử đọc tệp này -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r")
if aFile
content = aFile.sysread(20)
puts content
else
puts "Unable to open file!"
end
Câu lệnh này sẽ xuất ra 20 ký tự đầu tiên của tệp. Con trỏ tệp bây giờ sẽ được đặt ở ký tự thứ 21 trong tệp.
Phương pháp mã hóa
Bạn có thể sử dụng phương thức syswrite để ghi nội dung vào tệp. Bạn cần mở tệp ở chế độ ghi khi sử dụng phương thức syswrite. Ví dụ -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
else
puts "Unable to open file!"
end
Câu lệnh này sẽ ghi "ABCDEF" vào tệp.
Phương thức each_byte
Phương thức này thuộc về lớp File . Phương thức each_byte luôn được liên kết với một khối. Hãy xem xét mẫu mã sau:
#!/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
Các ký tự được chuyển lần lượt vào biến ch và sau đó hiển thị trên màn hình như sau:
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...
.
.
Phương pháp IO.readlines
Lớp File là một lớp con của lớp IO. Lớp IO cũng có một số phương thức, có thể được sử dụng để thao tác với tệp.
Một trong những phương thức của lớp IO là IO.readlines . Phương thức này trả về nội dung của từng dòng tệp. Đoạn mã sau hiển thị việc sử dụng phương pháp IO.readlines -
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
Trong đoạn mã này, biến arr là một mảng. Mỗi dòng của tệp input.txt sẽ là một phần tử trong mảng arr. Do đó, arr [0] sẽ chứa dòng đầu tiên, trong khi arr [1] sẽ chứa dòng thứ hai của tệp.
Phương pháp IO.foreach
Phương thức này cũng trả về đầu ra từng dòng. Sự khác biệt giữa phương pháp foreach và phương pháp readlines là phương pháp foreach được gắn liền với một khối. Tuy nhiên, không giống như các phương pháp readlines , phương pháp foreach không trả lại một mảng. Ví dụ -
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
Đoạn mã này sẽ chuyển nội dung của dòng kiểm tra tệp theo từng dòng đến khối biến, và sau đó kết quả sẽ được hiển thị trên màn hình.
Đổi tên và xóa tệp
Bạn có thể đổi tên và xóa tệp theo chương trình bằng Ruby với các phương pháp đổi tên và xóa .
Sau đây là ví dụ để đổi tên tệp hiện có test1.txt -
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )
Sau đây là ví dụ để xóa một tệp test2.txt hiện có -
#!/usr/bin/ruby
# Delete file test2.txt
File.delete("test2.txt")
Chế độ tệp và quyền sở hữu
Sử dụng phương thức chmod với mặt nạ để thay đổi chế độ hoặc danh sách quyền / quyền truy cập của tệp -
Sau đây là ví dụ để thay đổi chế độ của tệp test.txt hiện có thành giá trị mặt nạ:
#!/usr/bin/ruby
file = File.new( "test.txt", "w" )
file.chmod( 0755 )
Sr.No. | Mặt nạ & Mô tả |
---|---|
1 | 0700 mặt nạ rwx cho chủ sở hữu |
2 | 0400 r cho chủ sở hữu |
3 | 0200 w cho chủ sở hữu |
4 | 0100 x cho chủ sở hữu |
5 | 0070 mặt nạ rwx cho nhóm |
6 | 0040 r cho nhóm |
7 | 0020 w cho nhóm |
số 8 | 0010 x cho nhóm |
9 | 0007 mặt nạ rwx cho cái khác |
10 | 0004 r cho người khác |
11 | 0002 w cho cái khác |
12 | 0001 x cho người khác |
13 | 4000 Đặt ID người dùng khi thực thi |
14 | 2000 Đặt ID nhóm khi thực thi |
15 | 1000 Lưu văn bản đã hoán đổi, ngay cả sau khi sử dụng |
Yêu cầu tệp
Lệnh sau kiểm tra xem tệp có tồn tại hay không trước khi mở nó:
#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )
Lệnh sau hỏi xem tệp có thực sự là tệp hay không -
#!/usr/bin/ruby
# This returns either true or false
File.file?( "text.txt" )
Lệnh sau tìm xem tên tệp đã cho có phải là một thư mục hay không -
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
File::directory?( "file.rb" ) # => false
Lệnh sau tìm xem tệp có thể đọc được, có thể ghi hay thực thi được hay không:
#!/usr/bin/ruby
File.readable?( "test.txt" ) # => true
File.writable?( "test.txt" ) # => true
File.executable?( "test.txt" ) # => false
Lệnh sau tìm xem tệp có kích thước bằng 0 hay không:
#!/usr/bin/ruby
File.zero?( "test.txt" ) # => true
Lệnh sau trả về kích thước của tệp:
#!/usr/bin/ruby
File.size?( "text.txt" ) # => 1002
Lệnh sau có thể được sử dụng để tìm ra một loại tệp:
#!/usr/bin/ruby
File::ftype( "test.txt" ) # => file
Phương thức ftype xác định loại tệp bằng cách trả về một trong các giá trị sau - tệp, thư mục, characterSpecial, blockSpecial, Fifo, link, socket, hoặc không xác định.
Lệnh sau có thể được sử dụng để tìm thời điểm tệp được tạo, sửa đổi hoặc truy cập lần cuối:
#!/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
Thư mục trong Ruby
Tất cả các tệp được chứa trong các thư mục khác nhau và Ruby cũng không gặp vấn đề gì khi xử lý chúng. Trong khi lớp File xử lý các tệp, các thư mục được xử lý với lớp Dir .
Điều hướng qua các thư mục
Để thay đổi thư mục trong chương trình Ruby, hãy sử dụng Dir.chdir như sau. Ví dụ này thay đổi thư mục hiện tại thành / usr / bin .
Dir.chdir("/usr/bin")
Bạn có thể tìm ra thư mục hiện tại là gì với Dir.pwd -
puts Dir.pwd # This will return something like /usr/bin
Bạn có thể lấy danh sách các tệp và thư mục trong một thư mục cụ thể bằng cách sử dụng Dir.entries -
puts Dir.entries("/usr/bin").join(' ')
Dir.entries trả về một mảng với tất cả các mục trong thư mục được chỉ định. Dir.foreach cung cấp cùng một tính năng -
Dir.foreach("/usr/bin") do |entry|
puts entry
end
Một cách ngắn gọn hơn nữa để lấy danh sách thư mục là sử dụng phương thức mảng lớp của Dir -
Dir["/usr/bin/*"]
Tạo một thư mục
Các Dir.mkdir thể được sử dụng để tạo ra các thư mục -
Dir.mkdir("mynewdir")
Bạn cũng có thể đặt quyền trên một thư mục mới (không phải thư mục đã tồn tại) với mkdir -
NOTE - Mặt nạ 755 đặt quyền chủ sở hữu, nhóm, thế giới [bất kỳ ai] thành rwxr-xr-x trong đó r = read, w = write và x = thi hành.
Dir.mkdir( "mynewdir", 755 )
Xóa thư mục
Các Dir.delete có thể được sử dụng để xóa một thư mục. Các Dir.unlink và Dir.rmdir Thực hiện chính xác các chức năng tương tự và được cung cấp cho thuận tiện.
Dir.delete("testdir")
Tạo tệp & thư mục tạm thời
Tệp tạm thời là những tệp có thể được tạo trong thời gian ngắn trong quá trình thực thi chương trình nhưng không phải là nơi lưu trữ thông tin vĩnh viễn.
Dir.tmpdir cung cấp đường dẫn đến thư mục tạm thời trên hệ thống hiện tại, mặc dù phương thức này không khả dụng theo mặc định. Để làm cho Dir.tmpdir khả dụng, bạn cần sử dụng request 'tmpdir'.
Bạn có thể sử dụng Dir.tmpdir với File.join để tạo tệp tạm thời độc lập với nền tảng -
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)
Mã này tạo một tệp tạm thời, ghi dữ liệu vào tệp đó và xóa tệp đó. Thư viện chuẩn của Ruby cũng bao gồm một thư viện gọi là Tempfile có thể tạo các tệp tạm thời cho bạn -
require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close
Chức năng tích hợp sẵn
Dưới đây là các chức năng tích hợp sẵn của ruby để xử lý tệp và thư mục -
Lớp tệp và phương thức .
Lớp và Phương thức Dir .