A fájlokkal való munkához szükséges függvényeket a File modul biztosítja.
Egy teljes fájl beolvasásához használd a File.read/1 függvényt. Fájlba íráshoz pedig a File.write/2 függvényt.
A modul emellett másoláshoz, törléshez, átnevezéshez és hasonlókhoz is biztosít fájlműveleteket. A neveik hasonlítanak a UNIX-os megfelelőikre, például:
File.cp/3 - fájl másolása.File.rm/1 - fájl törlése.File.rename/2 - fájl átnevezése és/vagy áthelyezése.File.mkdir/1 - könyvtár létrehozása.File.cwd/0 - az aktuális munkakönyvtár lekérdezése.A File modul összes említett függvényének van egy ! változata is, amely a hibát jelző tuple visszaadása helyett hibát dob (például File.read!/1). Akkor használd ezt a változatot, ha nem szándékozol kezelni az olyan hibákat, mint például a hiányzó fájlok vagy a jogosultság hiánya.
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
Valahányszor egy fájlba a File.write/2 függvénnyel írunk, megnyílik egy fájlleíró, és elindul egy új Elixir-folyamat. Éppen ezért kerülni kell, hogy ciklusban írjunk fájlba a File.write/2 függvénnyel.
Ehelyett a fájlt a File.open/2 függvénnyel nyithatod meg. A File.open/2 második argumentuma a módok listája, amellyel megadhatod, hogy olvasásra vagy írásra szeretnéd-e megnyitni a fájlt.
A leggyakrabban használt módok:
:read - olvasásra nyitja, a fájlnak léteznie kell:write - írásra nyitja, a fájl létrejön, ha nem létezik, a meglévő tartalom felülíródik:append - írásra nyitja, a fájl létrejön, ha nem létezik, a meglévő tartalom megmaradA módok teljes listját a File.open/2 dokumentációjában találod.
A File.open/2 annak a folyamatnak a PID-jét adja vissza, amely a fájlt kezeli. A fájl olvasásához és írásához az IO modul függvényeit használd, és add át ezt a PID-et IO-eszközként.
Amikor végeztél a fájllal, zárd be a File.close/1 függvénnyel.
file = File.open!("README.txt", [:write])
# => #PID<0.157.0>
IO.puts(file, "# README")
# => :ok
File.close(file)
# => :ok
Ha a File.read/1 függvénnyel olvasol be egy fájlt, az a teljes fájlt egyszerre tölti be a memóriába. Ez problémát jelenthet, ha igazán nagy fájlokkal dolgozol. A hatékony kezelésükhöz használhatod a File.open/2 és az IO.read/2 függvényt, hogy soronként olvasd be a fájlt, vagy streamelheted a fájlt a File.stream/3 függvénnyel. A stream egyszerre valósítja meg az Enumerable és a Collectable protokollt, ami azt jelenti, hogy olvasásra és írásra egyaránt használható.
File.stream!("file.txt")
|> Stream.map(&(&1 <> "!"))
|> Stream.into(File.stream!("new_file.txt"))
|> Stream.run()
Minden fájlokkal dolgozó függvény megkövetel egy elérési utat. Az elérési utak lehetnek abszolútak vagy az aktuális könyvtárhoz képestiek. Az elérési utak kezeléséhez a Path modul függvényeit használd. A platformok közötti kompatibilitás érdekében a Path.join/1 függvénnyel hozz létre elérési utakat. Ez a platformnak megfelelő elválasztót választja.
Path.expand(Path.join(["~", "documents", "important.txt"]))
"/home/user/documents/important.txt"