12/08/2018, 16:06

Thao tác cơ bản với File và Directory trong Ruby

Trong bài viết này sẽ gồm những cách thao tác với các file và các thư mục. Ruby cung cấp một số cơ chế để đọc và viết các file, liệt kê danh sách các thư mục, vv... Trong bai viết này sẽ có thêm vài thứ cơ bản. Hãy theo dõi từng mục. Liệt kê các files Chúng ta có thể nhanh chóng và dễ dàng ...

Trong bài viết này sẽ gồm những cách thao tác với các file và các thư mục.

Ruby cung cấp một số cơ chế để đọc và viết các file, liệt kê danh sách các thư mục, vv... Trong bai viết này sẽ có thêm vài thứ cơ bản. Hãy theo dõi từng mục.

Liệt kê các files

Chúng ta có thể nhanh chóng và dễ dàng liệt kê tất cả các file trong một thư mục bằng cách sử dụng Dir.glob.

Dir.glob("*") # => Liệt kê tất cả các file trong thư mục hiện tại và tất cả các thư mục con.
Dir.glob("*.jpg") #=> Liệt kê những file có đuổi là jpg trong thư mục hiện tai.
Dir.glob(["*.jpg", "*.png"]) #=>  Liệt kê nhữn file có đuổi jpg và png trong thư mục hiện tai.
Dir["*.jpg","*.png"] #=> Đây là cách viết tắt của dir.glob tương đương với Dir.glob([])

Chúng ta có thể dùng patterns với Dir.glob.

Dir.glob("ruby.ex?") #=> ruby.exe
Dir.glob("*.[a-z][a-z]") #=>  Trả về bất cứ file với đuổi 2 chữ số
Dir.glob("*.{exe,dll}")  #=> Trả về những file exe và dll

Chúng ta có thể lặp qua mỗi filename sử dụng Dir.foreach.

Dir.foreach(".") do |file|
  puts file
end

Lấy thông tin và chuyển các thư mục

Để biết thư mục hiện tại sẽ dụng Dir.pwd ngoài ra chúng ta cũng có thể biết được tên user của thư mục home với Dir.home.

Dir.pwd # => Trả về đường dẫn thư mục đang nằm.
Dir.home # => Trả về thư mục home của người dùng.
Dir.home("root") # => Trả về đường root của thư mục home của người dùng.

Có thể dùng Dir.chir để chuyển thư mục.

Dir.pwd # => "/Users/kimhuorlim"
Dir.chdir("/") # => thư mục hiện tại bây giờ là root.
Dir.chdir("/root") # => thư mục hiện tại bây giờ là root.
Dir.chdir("..") # => thư mục hiện tại là /

Tạo và xóa các thư mục

Các thư mục có thể tạo bằng lệnh Dir.mkdir và xóa các thư mục bằng lệnh Dir.rmdir. Chú ý rằng thư mục phải rỗng mới xóa được.

Dir.mkdir("RubyTest") #=> Tạo một thư mục có tên RubyTest
Dir.rmdir("RubyTest") #=> Xóa thư mục RubyTest

Xác định thư mục có tồn tại

Chúng ta có thể xác định liệu thư mục có tồn tại với lệnh Dir.exists?.

Dir.exists?("mydir") #=> Trả về true nếu thư mục có tồn tại hoặc khác sẽ trả về false.

Tạo các đường dẫn

Hệ điều hành Windows có đường dẫn(path) riêng biệt khác các hệ điều hành khác. Để tạo các đường dẫn được khuyến khích dùng câu lệnh File.join ví dụ

home = Dir.home
File.join(home, ".ssh") #=> "/Users/kimhuorlim/.ssh" or C:/Users/kimhuorlim/.ssh phụ thuộc vào hệ điều hành.

Việc hardcode làm cho đường dẫn không tương thích với Linux, OS X hoặc Windows. Ví dụ:

ssh_folder = "/root/.ssh" #=> Không hoạt động trên windows.
ssh_folder = "C:/Users/kimhuorlim/.ssh" #=> Không hoạt động trên linux hoặc OS X.

Chúng ta có thể lấy được đường dẫn tuyệt đối của một file bằng File.absolute_path.

File.absolute_path("current") #=> "/Users/kimhuorlim/current"

Tiếp theo để lấy base name của file File.basename.

File.basename("/etc/init.d/mysqld") #=> mysqld

Cuối cùng để mở rộng một đường dẫn cho trước bằng File.expand_path.

File.expand_path("~/Documents") #=> "/Users/kimhuorlim/Documents"
File.expand_path(".")  #=> "/Users/kimhuorlim"

Đọc và ghi các file

Chúng ta có thể mở một file có sẵn hoặc tạo một file mới với File.open. Lưu ý rằng cờ w sẽ ghi đè trên file cũ. Sử dụng cờ a để thêm vào một file có sẵn.

f = File.open("log.txt", "w")
f.close #=> Phải chắc chắn close file sau khi mở nó.

Để xóa file dùng câu lệnh File.delete.

File.delete("log.txt") #=> xóa file log.txt.

Ghi vào các file thật dễ chỉ dùng phương thức write.

f = File.open("log.txt", "w")
f.write("Warning: some really crazy stuff just happened!
")
f.write("Warning: I don't know what to do!
")
f.close #=> Đừng quên đó lại file.

Ngoài ra các phương thước dưới này có thể dùng để đọc file.

f = File.open("log.txt", "r")
f.read(3) #=> trả về 'War' từ đoạn văn trên.
f.rewind #=> di chuyển con trỏ trở lại vị trí bắt đầu của tệp.
f.read(3) #=> trả về 'War' một lần nữa.
f.rewind #=> di chuyển con trỏ trở lại vị trí bắt đầu của tệp.
f.seek(3)  #=> di chuyển con trỏ tới vị trí thứ ba trong file.
f.read(3) #=> trả về 'nin'
f.rewind #=> di chuyển con trỏ trở lại vị trí bắt đầu của tệp.
f.readline #=> trả về "Warning: some really crazy stuff just happened!
"
f.rewind #=> di chuyển con trỏ trở lại vị trí bắt đầu của tệp.
f.read  #=> đọc toàn bộ nội dung file.

Kết luận

Bài viết nằm mục đích chia sẻ kiến thức cơ bản về các thao tác với thư mục và file trong Ruby.

Tham khảo

  • Bài viết gốc
  • The Directory Class at RubyDoc, covers directory manipulation.
  • The File Class at RubyDoc, covers file manipulation.
  • The IO Class at RubyDoc, covers reading/writing to files.
0