Make a zip file in Elixir

I have a text file and I want to make a zip file from it using Elixir or just to compress its folder.

files =!("path") 
           |> filename -> Path.join("path", filename) end)

I then use :zip.create("", files) to write the zip file. It returns a tuple: {:ok, ""} but the file does not get saved.
Where is my mistake? Or can I get some sort of a solution? Thanks.

1 Like

The file is created in the working dir of the running BEAM VM, you can check with System.cwd/0.


And usually this is the folder that your ‘mix.exs’ is also in. If you are running in development that is.
When you have made a release, the folder location might be different.


Okay, zip file is created but there is another problem. It writes the whole path to the file, for example “/home/user/project/text.txt” and not just the file. Is there any other way just to compress the text file without its path?

According to the Erlang docs on :zip.create/3 there is an optional third argument with options where you could set the working directory for compression with [cwd: path]. The effect is that files will be looked up within that path and will omit the path in the compressed file.

Expanding on your example:

files =!(path)

:zip.create("", files, cwd: path)
$ unzip -l
  Length      Date    Time    Name
---------  ---------- -----   ----
   212151  09-22-2016 17:32   file1.txt
   333814  09-22-2016 17:32   file2.txt
   269066  09-22-2016 17:32   file3.txt
   333736  09-22-2016 17:32   file4.txt
   284213  09-22-2016 17:32   file5.txt
---------                     -------
  1432980                     5 files