Đọc/ghi file văn bản
Hãy cùng xem xem Ruby xử lý file văn bản như thế nào trong chương trình đơn giản p027readwrite.rb:
# Open and read from a text file
# Note that since a block is given, file will
# automatically be closed when the block terminates
File.open('p014constructs.rb', 'r') do |f1|
while line = f1.gets
puts line
end
end
# Create a new file and write to it
File.open('test.rb', 'w') do |f2|
# use "\n" for two lines of text
f2.puts "Created by Satish\nThank God!"
end
Phương thức File.open có thể mở file dưới nhiều chế độ như ‘r’ – chỉ mở để đọc, và bắt đầu từ đầu file (mặc định); ‘r+’ Đọc/Ghi, bắt đầu từ đầu file; ‘w’ – Chỉ ghi, xóa nội dung của file và tạo mới để ghi. Chi tiết đầy đủ về tất cả các chế độ xử lý file, bạn có thể xem thêm tại tài liệu tra cứu Ruby online.
File.open, nếu không đi kèm theo khối mã, sẽ mở file, và khi xử lý xong bạn sẽ phải dùng phương thức close để đóng file. Còn nếu bạn gọi File.open đi kèm khối mã, thì file được mở sẽ được truyền vào khối mã như một tham số, và khi khối mã kết thúc việc xử lý file, thì file cũng sẽ tự động được đóng lại.
Nên nhớ rằng phải luôn luôn chắc chắn file được đóng sau khi đã xử lý. Trong trường hợp bạn ghi thông tin vào file, nếu không đóng file dữ liệu sẽ bị mất.
Lớp File có một phương thức readlines có công dụng đọc từng dòng của file và gán nó cho từng phần tử của một mảng.
Cả hai phương thức lớp open và readlines đều thuộc lớp IO, là lớp mẹ của lớp File. Chúng ta sẽ học về Lớp, Đối tượng và Thừa kế về sau.
Duyệt cây thư mục
Module Find hỗ trợ việc duyệt cây thư mục, với tham số truyền vào phương thức find là gốc của cây thư mục muốn duyệt. Nếu tham số đó là một thư mục, thì thuộc tính của từng file hay thư mục con sẽ được truyền vào làm tham số của khối mã đi kèm.
require 'find'
Find.find('./') do |f|
type = case
when File.file?(f): "F"
when File.directory?(f): "D"
else "?"
end
puts "#{type}: #{f}"
end
Chúng ta sẽ nói thêm về require sau.
Truy nhập ngẫu nhiên
Giả sử ta có một file văn bản (tên là hellousa.rb), nội dung của nó như sau:
puts ‘Hello USA'
Giờ ta cần hiển thị nội dung của file này nhưng chỉ bắt đầu từ chữ “USA” mà thôi. Đây là cách để làm điều đó – chương trình p028xrandom.rb
# We now need to display the contents of the file from the word USA
f = File.new('hellousa.rb')
# SEEK_CUR - Seeks to first integer number parameter plus current position
# SEEK_END - Seeks to first integer number parameter plus end of stream
# (you probably want a negative value for first integer number parameter)
# SEEK_SET - Seeks to the absolute location given by first integer number parameter
# :: is the scope operator - more on this later
f.seek(12, IO::SEEK_SET)
print f.readline
f.close
Kết quả là:
>ruby p028xrandom.rb USA' >Exit code: 0
Ruby hỗ trợ con trỏ trong file. Con trỏ file cho biết vị trí hiện thời trong file. Phương thức File.new mở file ‘hellousa.rb’ trong chế độ read-only (chỉ đọc – chế độ mặc định), trả lại đối tượng File và con trỏ sẽ nằm ở đầu file. Trong chương trình trên, lệnh tiếp theo là f.seek(12, IO::SEEK_SET). Phương thức seek thuộc lớp IO, đưa con trỏ trong file đến một vị trí nhất định (tham số nguyên đầu tiên) dựa trên vị trí tương đối cho trong tham số thứ hai:
- IO::SEEK_CUR: Chuyển đến vị trí cho trong tham số thứ nhất tính từ vị trí hiện thời.
- IO::SEEK_END: Chuyển đến vị trí cho trong tham số thứ nhất tính từ vị trí cuối file (thường thì tham số thứ nhất là số âm)
- IO::SEEK_SET: Chuyển đến vị trí tuyệt đối cho bởi tham số thứ nhất.
Để biết thêm về toán tử phạm vi (scope operator) ::, bạn có thể xem thêm tại đây.
Ruby có hỗ trợ Object Serialization (chuyển hóa đối tượng) không?
Java hỗ trợ chức năng chuyển hóa đối tượng, cho phép bạn lưu trữ nó ở một vị trí nào đó, và tổng hợp lại khi cần. Ruby gọi chức năng này là “serialization marshaling” (chả biết dịch thế nào, thôi cứ dịch bừa là tổng hợp chuyển hóa vậy). Lưu một đối tượng và một số (hoặc tất cả) thành phần của nó được thực hiện bằng cách sử dụng phương thức Marshal.dump. Sau này bạn sẽ có thể tổng hợp lại đối tượng đó sử dụng Marshal.load. Ruby sử dụng quy trình này để lưu trữ dữ liệu về phiên làm việc (session data). Ta sẽ nói về chuyển hóa sau.
Giang said,
khi sử dụng lệnh File.exist?(filename) thì filename không được phép là 1 path thì fải?
liệu muốn kiểm tra trên host có file test.doc không thì có cách nào không? tớ thử
File.exist?(”http://……/test.doc”) nhưng không được !
à hình như File.file và File.exist giống nhau thì fải?
giúp tớ với !
Giang said,
tớ vừa phát hiện ra nếu muốn kiểm tra 1 file trên máy tính của mình thì dùng path với dấu “/” thay vì “\” hic
trường hợp tớ gõ path là 1 URL thì vẫn k đc ! ví dụ
File.exist?(”http://localhost:3000/images/test.jpg”)
hic giải quyết thế nào jờ C40?
Giang said,
hic thì ra khi check xem có tồn tại file đó không thì bắt buộc dùng path ?! còn trong tag thì dùng URL
(tớ cần check 1 file ảnh có tồn tại không, nếu có thì hiện)
sorry bạn, tớ post lăng nhăng quá hì hì
c40 said,
Chào bạn Giang,
Khi viết đường dẫn file, bạn không nên dùng dấu “\” vì nó dễ bị hiểu lầm với dấu kí tự thoát. Ví dụ chuỗi “I said \”Hello\”" sẽ tương đương với I said “Hello” khi in ra màn hình. Nếu bạn để đường dẫn của bạn là “C:\a\b” chẳng hạn, ruby sẽ tưởng \a và \b là kí tự đặc biệt bên trong chuỗi. Có lẽ dùng dấu ngoặc nhỏ ‘ ‘ thì sẽ chuẩn hơn.
Còn dùng File.exist? thì tớ nghĩ là không dùng để kiểm tra file trên host được đâu bạn ạ
Nếu bạn chạy script trên host, thì có thể dùng đường dẫn “/images/test.jpg” thay vì sử dụng “http://localhost .v.v.”. Tớ chưa mày mò vào rails lắm nên cũng chưa tìm hiểu kĩ về mấy cái này ![]()
Giang said,
Chào bạn C40,
tớ cũng mới nhận thấy hoạt động của dấu nháy đơn ‘ và nháy kép ” như bạn nói
File.exist? không kiểm tra file trên host đc cũng đúng luôn
nhưng chẳng lẽ lại viết File.exist?(C:\…) thế thì khi up lên host đâu còn đường dẫn như thế, đó là điều đêm qua tớ băn khoăn mãi T__T, cuối cùng tìm được cách giải quyết là File.exist?(#{RAILS_ROOT}/images….)
cảm ơn bạn đã confirm ![]()
ngo duc huy said,
he he may wa minh vua hoc ruby neu ko co bai nay chac tra cung mat ca ngay nhi ??? thanks for all
RSS feed for comments on this post · TrackBack URI