Elixir - Tệp IO
Tệp IO là một phần không thể thiếu của bất kỳ ngôn ngữ lập trình nào vì nó cho phép ngôn ngữ tương tác với các tệp trên hệ thống tệp. Trong chương này, chúng ta sẽ thảo luận về hai mô-đun - Path và File.
Mô-đun đường dẫn
Các pathmô-đun là một mô-đun rất nhỏ có thể được coi là một mô-đun trợ giúp cho các hoạt động của hệ thống tệp. Phần lớn các hàm trong mô-đun Tệp mong đợi các đường dẫn là đối số. Thông thường nhất, những đường dẫn đó sẽ là các mã nhị phân thông thường. Mô-đun Path cung cấp các phương tiện để làm việc với các đường dẫn như vậy. Việc sử dụng các chức năng từ mô-đun Đường dẫn thay vì chỉ thao tác với các tệp nhị phân được ưu tiên vì mô-đun Đường dẫn xử lý các hệ điều hành khác nhau một cách minh bạch. Có thể thấy rằng Elixir sẽ tự động chuyển đổi dấu gạch chéo (/) thành dấu gạch chéo ngược (\) trên Windows khi thực hiện các thao tác với tệp.
Chúng ta hãy xem xét ví dụ sau để hiểu thêm về mô-đun Đường dẫn -
IO.puts(Path.join("foo", "bar"))
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
foo/bar
Có rất nhiều phương thức mà mô-đun đường dẫn cung cấp. Bạn có thể xem các phương pháp khác nhau tại đây . Những phương pháp này thường được sử dụng nếu bạn đang thực hiện nhiều thao tác thao tác với tệp.
Mô-đun tệp
Mô-đun tệp chứa các chức năng cho phép chúng tôi mở tệp dưới dạng thiết bị IO. Theo mặc định, các tệp được mở ở chế độ nhị phân, điều này yêu cầu các nhà phát triển sử dụngIO.binread và IO.binwritecác chức năng từ mô-đun IO. Hãy để chúng tôi tạo một tệp có tênnewfile và ghi một số dữ liệu vào nó.
{:ok, file} = File.read("newfile", [:write])
# Pattern matching to store returned stream
IO.binwrite(file, "This will be written to the file")
Nếu bạn mở tệp chúng tôi vừa viết vào, nội dung sẽ được hiển thị theo cách sau:
This will be written to the file
Bây giờ chúng ta hãy hiểu cách sử dụng mô-đun tệp.
Mở tệp
Để mở một tệp, chúng ta có thể sử dụng bất kỳ một trong 2 chức năng sau:
{:ok, file} = File.open("newfile")
file = File.open!("newfile")
Bây giờ chúng ta hãy hiểu sự khác biệt giữa File.open chức năng và File.open!() chức năng.
Các File.openhàm luôn trả về một bộ giá trị. Nếu tệp được mở thành công, nó trả về giá trị đầu tiên trong bộ giá trị là:okvà giá trị thứ hai là nghĩa đen của kiểu io_device. Nếu lỗi được gây ra, nó sẽ trả về một bộ giá trị đầu tiên là:error và giá trị thứ hai là lý do.
Các File.open!() mặt khác, hàm sẽ trả về io_devicenếu tệp được mở thành công khác, nó sẽ phát sinh lỗi. LƯU Ý: Đây là mẫu được theo sau trong tất cả các chức năng của mô-đun tệp mà chúng ta sẽ thảo luận.
Chúng tôi cũng có thể chỉ định các chế độ mà chúng tôi muốn mở tệp này. Để mở tệp ở dạng chỉ đọc và ở chế độ mã hóa utf-8, chúng tôi sử dụng mã sau:
file = File.open!("newfile", [:read, :utf8])
Ghi vào tệp
Chúng tôi có hai cách để ghi vào tệp. Hãy để chúng tôi xem cái đầu tiên sử dụng chức năng ghi từ mô-đun Tệp.
File.write("newfile", "Hello")
Nhưng điều này không nên được sử dụng nếu bạn đang ghi nhiều lần vào cùng một tệp. Mỗi khi hàm này được gọi, một bộ mô tả tệp sẽ được mở và một quá trình mới được tạo ra để ghi vào tệp. Nếu bạn đang ghi nhiều lần trong một vòng lặp, hãy mở tệp quaFile.openvà ghi vào nó bằng các phương thức trong mô-đun IO. Chúng ta hãy xem xét một ví dụ để hiểu giống nhau -
#Open the file in read, write and utf8 modes.
file = File.open!("newfile_2", [:read, :utf8, :write])
#Write to this "io_device" using standard IO functions
IO.puts(file, "Random text")
Bạn có thể sử dụng các phương pháp mô-đun IO khác như IO.write và IO.binwrite để ghi vào các tệp được mở dưới dạng io_device.
Đọc từ một tệp
Chúng tôi có hai cách để đọc từ tệp. Hãy để chúng tôi xem cái đầu tiên sử dụng chức năng đọc từ mô-đun Tệp.
IO.puts(File.read("newfile"))
Khi chạy mã này, bạn sẽ nhận được một bộ giá trị với phần tử đầu tiên là :ok và cái thứ hai là nội dung của newfile
Chúng tôi cũng có thể sử dụng File.read! chức năng chỉ lấy nội dung của các tệp trả lại cho chúng tôi.
Đóng một tệp đang mở
Bất cứ khi nào bạn mở tệp bằng chức năng File.open, sau khi sử dụng xong, bạn nên đóng tệp bằng File.close chức năng -
File.close(file)