Fi

File ebben a kurzusban: Elixir

2 feladat

A(z) File fogalomról

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:

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

Fájlok és folyamatok

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 megmarad

A 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

Fájlok streamelése

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()

Elérési utak

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"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) File fogalmat

A gyakorlás zárolva

Oldj fel még 1 feladatot, hogy gyakorolhasd a(z) File fogalmat