Nasıl Elixir bir dizin sıkıştırmak için?

oy
5

Ben Elixir'in yazma modunda bir zip dosyasını açmak için biliyorum:

file = File.open(myzip.zip, [:write, :compressed])

Ben bir dizin varsa ancak bundan sonra ki /home/lowks/big_files, bunu nasıl içine yazıyorum file?

Oluştur 21/03/2014 saat 05:55
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
9

Eğer zip dosyaları üzerinde çalışıyorsanız, kullanmak gerekir :zip.extract('foo.zip')ve :zip.create(name, [{'foo', file1data}, file2path, ...]).

:zip.create Bir isim ve iki seçenekten birini içerebilir listesini alır:

  1. Bir dosya adını içeren kayıt düzeni ve ikili veri zip.
  2. Bir dosyaya bir yol zip.

:zip.extractBir dosyaya bir yol almak veya zip arşivi temsil ikili veri (belki yapmaktan ya File.openbir zip üzerine).

Bir yoldaki dosyaların listesini almak ve onları sıkıştırmak için aşağıdaki gibi bir şey yapabilirsiniz:

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

:zip.create('foo.zip', files)
Cevap 21/03/2014 saat 23:24
kaynak kullanıcı

oy
0

Bu oldukça iyi bir cevap, ama burada bir yerden zip dizinleri ekleyerek yinelemeli destekleyen daha iyi bir tanesidir.

  files = create_files_list(path)
  :zip.create(to_charlist(zip_file_path), files)

Ve burada create_files_list geçerli:

  defp create_files_list(path) do
    create_files_list(File.ls!(path), path)
  end
  defp create_files_list(paths, path) do
    create_files_list(paths, path, path)
  end
  defp create_files_list(paths, path, base_path) do
    Enum.reduce(paths, [],
      fn(filename, acc) ->
        filename_path = Path.join(path, filename)
        if File.dir?(filename_path) do
          acc ++ create_files_list(File.ls!(filename_path), filename_path, base_path)
        else
          filenm = 
            if base_path, 
              do: String.replace_leading(filename_path, base_path, ""), 
              else: filename_path
          [{String.to_char_list(filenm), File.read!(filename_path)} | acc]
        end
      end
    )
  end

Uyarı kelimesi; Ben çok büyük bir şey için bu kullanmıyorum, burada File.read kullanarak her şeyi bozabilir. Ben Dosya kolları nasıl kullanılacağını emin değilim ama bunun mümkün olduğunu düşünüyorum. iyileştirmek ve geri katkıda çekinmeyin ;-)

Her zaman yürütülmez yüzden de zip dosyasını önbelleğe.

Cevap 24/06/2017 saat 06:44
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more