Make a zip file in Elixir

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

files = File.ls!("path") 
           |> Enum.map(fn filename -> Path.join("path", filename) end)
           |> Enum.map(&String.to_charlist/1)

I then use :zip.create("foo.zip", files) to write the zip file. It returns a tuple: {:ok, "foo.zip"} 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.

3 Likes

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.

2 Likes

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 =
  File.ls!(path)
  |> Enum.map(&String.to_charlist/1)

:zip.create("files.zip", files, cwd: path)
$ unzip -l files.zip
Archive:  files.zip
  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
6 Likes