Οι συναρτήσεις για την εργασία με αρχεία παρέχονται από τη μονάδα File.
Για να διαβάσεις ένα ολόκληρο αρχείο, χρησιμοποίησε τη συνάρτηση File.read/1. Για να γράψεις σε ένα αρχείο, χρησιμοποίησε τη συνάρτηση File.write/2.
Η μονάδα παρέχει επίσης συναρτήσεις για αντιγραφή, διαγραφή, μετονομασία κ.λπ. Τα ονόματά τους μοιάζουν με τα αντίστοιχα UNIX, για παράδειγμα:
File.cp/3 - αντιγράφει ένα αρχείο.File.rm/1 - διαγράφει ένα αρχείο.File.rename/2 - μετονομάζει ή/και μετακινεί ένα αρχείο.File.mkdir/1 - δημιουργεί έναν κατάλογο.File.cwd/0 - επιστρέφει τον τρέχοντα κατάλογο εργασίας.Όλες οι παραπάνω συναρτήσεις της μονάδας File έχουν και μια παραλλαγή με !, η οποία πετάει ένα σφάλμα αντί να επιστρέψει μια πλειάδα σφάλματος (π.χ. File.read!/1). Χρησιμοποίησε αυτή την παραλλαγή αν δεν σκοπεύεις να χειριστείς σφάλματα, όπως αρχεία που λείπουν ή έλλειψη δικαιωμάτων.
File.read("does_not_exist")
# => {:error, :enoent}
File.read!("does_not_exist")
# => ** (File.Error) could not read file "does_not_exist": no such file or directory
# (elixir 1.10.4) lib/file.ex:353: File.read!/1
Κάθε φορά που γράφεις σε ένα αρχείο με τη συνάρτηση File.write/2, ανοίγει ένας περιγραφέας αρχείου και δημιουργείται μια νέα διεργασία της Elixir. Για αυτό τον λόγο, καλό είναι να αποφεύγεις το γράψιμο σε αρχείο μέσα σε βρόχο με τη συνάρτηση File.write/2.
Αντ' αυτού, μπορείς να ανοίξεις ένα αρχείο με τη συνάρτηση File.open/2. Το δεύτερο όρισμα της File.open/2 είναι μια λίστα με τρόπους λειτουργίας, που σου επιτρέπει να ορίσεις αν θέλεις να ανοίξεις το αρχείο για ανάγνωση ή για εγγραφή.
Οι πιο συνηθισμένοι τρόποι λειτουργίας είναι:
:read - άνοιγμα για ανάγνωση, το αρχείο πρέπει να υπάρχει:write - άνοιγμα για εγγραφή, το αρχείο θα δημιουργηθεί αν δεν υπάρχει, το υπάρχον περιεχόμενο θα αντικατασταθεί:append - άνοιγμα για εγγραφή, το αρχείο θα δημιουργηθεί αν δεν υπάρχει, το υπάρχον περιεχόμενο θα διατηρηθείΓια μια πλήρη λίστα όλων των τρόπων λειτουργίας, δες την τεκμηρίωση της File.open/2.
Η File.open/2 επιστρέφει το PID μιας διεργασίας που χειρίζεται το αρχείο. Για να διαβάσεις και να γράψεις στο αρχείο, χρησιμοποίησε συναρτήσεις της μονάδας IO και πέρασε αυτό το PID ως συσκευή IO.
Όταν τελειώσεις με το αρχείο, κλείσε το με τη συνάρτηση File.close/1.
file = File.open!("README.txt", [:write])
# => #PID<0.157.0>
IO.puts(file, "# README")
# => :ok
File.close(file)
# => :ok
Το διάβασμα ενός αρχείου με τη συνάρτηση File.read/1 θα φορτώσει ολόκληρο το αρχείο στη μνήμη μεμιάς. Αυτό μπορεί να είναι πρόβλημα όταν δουλεύεις με πολύ μεγάλα αρχεία. Για να τα χειριστείς αποδοτικά, μπορείς να χρησιμοποιήσεις τη συνάρτηση File.open/2 και τη συνάρτηση IO.read/2 για να διαβάσεις το αρχείο γραμμή προς γραμμή, ή μπορείς να κάνεις ροή του αρχείου με τη συνάρτηση File.stream/3. Η ροή υλοποιεί και τα δύο πρωτόκολλα, Enumerable και Collectable, που σημαίνει ότι μπορεί να χρησιμοποιηθεί τόσο για ανάγνωση όσο και για εγγραφή.
File.stream!("file.txt")
|> Stream.map(&(&1 <> "!"))
|> Stream.into(File.stream!("new_file.txt"))
|> Stream.run()
Όλες οι συναρτήσεις που δουλεύουν με αρχεία απαιτούν μια διαδρομή αρχείου. Οι διαδρομές αρχείων μπορεί να είναι απόλυτες ή σχετικές ως προς τον τρέχοντα κατάλογο. Για τον χειρισμό διαδρομών, χρησιμοποίησε συναρτήσεις της μονάδας Path. Για συμβατότητα μεταξύ πλατφορμών, χρησιμοποίησε τη συνάρτηση Path.join/1 για να δημιουργήσεις διαδρομές. Θα επιλέξει το διαχωριστικό που ταιριάζει στην πλατφόρμα.
Path.expand(Path.join(["~", "documents", "important.txt"]))
"/home/user/documents/important.txt"