README.md

# zipflow

zipflow is a library for elixir language that allows you to stream the
zip archive while it is being created.

## installation

the package can be installed as:

  1. add zipflow to your list of dependencies in `mix.exs`:

        def deps do
          [{:zipflow, github: "dgvncsz0f/zipflow"}]
        end

## the problem

erlang provides a `:zip` module that can be used to create a zip
archive. however you can not use that to stream the zip file. using
erlang's `:zip` module you only have the option to write to a file or
entirely on memory.

this module solves that problem by streaming the contents of the zip
file while it is being created.

## example

this example writes a zip file to a file:

```
iex> File.open("/path/to/file", [:raw, :binary, :write], fn fh ->
...>   printer = & IO.binwrite(fh, &1)
...>   Zipflow.Stream.init
...>   |> Zipflow.Stream.entry(Zipflow.DataEntry.encode(printer, "foo/bar", "foobar"))
...>   |> Zipflow.Stream.flush(printer)
...> end)
```

Then you should have:

```
$ unzip -l /path/to/file
Archive:  example.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        6  1980-00-00 00:00   foo/bar
---------                     -------
        6                     1 file
```

another example, this time archiving a file:

```
iex> File.open("/path/to/file", [:read, :raw, :binary], fn fh ->
...>   printer = & IO.binwrite(fh, &1)
...>   Zipflow.Stream.init
...>   |> Zipflow.Stream.entry(Zipflow.FileEntry.encode(printer, "foo/bar", fh))
...>   |> Zipflow.Stream.flush(printer)
...> end)
```

the `FileEntry` consumes the file in chunks so it has a low memory
footprint. However, this is not a zip64 format so the maximum file
size you can archive is 4G.

There is a script you can use for testing. It archives a directory:

```
$ mix escript.build
$ ./zipflow /tmp/zipflow.zip lib/bin
$ unzip -l /tmp/zipflow.zip
Archive:  /tmp/zipflow.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      301  1980-00-00 00:00   lib/bin/zip.ex
---------                     -------
      301                     1 file
```

## todo

* [ ] encryption;
* [ ] compression;
* [ ] utf encoding;
* [ ] zip64 format;
* [ ] file/archive comments;
* [ ] store date/time correctly;
* [ ] support more than 2^16 files;

## licence

BSD-3

## contributors (thanks!)

* @feymartynov
* @nicholasjhenry