Fi

File σε Elixir

2 ασκήσεις

Σχετικά με την έννοια File

Οι συναρτήσεις για την εργασία με αρχεία παρέχονται από τη μονάδα 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"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια File

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια File