2013-03-20 14 views
16

Jestem nurkowanie w Zlib z node.js. Udało mi się skompresować i zdekompresować pliki przy użyciu podanych przykładów (http://nodejs.org/api/zlib.html#zlib_examples), ale nie mogłem znaleźć więcej informacji na temat robienia tego samego dla folderów?node.js - Zip/Rozpakuj folder

Jedną z możliwości (ale którą uważam za majsterkowanie) jest użycie modułu node-zip i dodawanie po kolei wszystkich plików w folderze. Ale napotkam problem podczas dekompresji (w tym przypadku utracę foldery).

Każdy pomysł jak skompresować (i następnie rozpakować) cały folder (poszanowaniu hierarchii sub-lutowanie) przy użyciu node.js?

Dzięki.

+1

Zlib jest po prostu commpression, chcesz tar folder, a następnie skompresować go, całą rzecz tar.gz, spróbuj https://github.com/isaacs/node-tar – generalhenry

+0

Oh, rozumiem! Muszę to zrobić w dwóch krokach: 1/Konwertuj folder na plik '.tar', a następnie 2/Kompresuj plik' .tar' do '.tar.gz' używając Zlib. Moduł 'node-tar' nie jest dobrze udokumentowany, czy masz jakieś dodatkowe zasoby? – htaidirt

+1

Spojrzałem, najlepiej znalazłem https://github.com/cthackers/adm-zip – generalhenry

Odpowiedz

25

mam w końcu dostał to, z pomocą @generalhenry (patrz komentarze na pytanie) i

jak wspomniano w komentarzach, musimy skompresować folder, w dwóch etapach:

  1. Konwersja folderu w pliku .tar

  2. skompresować plik .tar

Aby wykonać pierwszy krok, potrzebowałem dwa node.js moduły:

npm install tar 
npm install fstream 

Pierwszy z nich pozwala nam tworzyć .tar plików. Możesz mieć dostęp do kodu źródłowego tutaj https://github.com/isaacs/node-tar

Drugi moduł węzłowy pomoże nam odczytać folder i napisać plik. Jeśli chodzi o podstawowy modułnode.js, nie wiem, czy można odczytać katalog (nie mówię o uzyskiwaniu wszystkich plików w tablicy, używając fs.readdir, ale obsługuję wszystkie pliki i ich organizację w folderach).

Następnie, po przekonwertowaniu folderu na plik .tar, mogę skompresować go za pomocą Gzip() z Zlib.

Oto ostateczny kod:

var fstream = require('fstream'), 
    tar = require('tar'), 
    zlib = require('zlib'); 

fstream.Reader({ 'path': 'path/to/my/dir/', 'type': 'Directory' }) /* Read the source directory */ 
.pipe(tar.Pack()) /* Convert the directory to a .tar file */ 
.pipe(zlib.Gzip()) /* Compress the .tar file */ 
.pipe(fstream.Writer({ 'path': 'compressed_folder.tar.gz' })); /* Give the output file name */ 

To pomogło mi skompresować cały folder przy użyciu node.js

2 więcej rzeczy:

  • Jak widać, istnieje jest brak dokumentacji na module tar. Mam nadzieję, że wkrótce nastąpi poprawa, ponieważ dwa dostarczone przykłady mówią o tym, jak wyodrębnić zawartość z pliku .tar.

  • Użyłem modułu fstream, aby pomóc mi obsłużyć katalog źródłowy. Czy można ominąć to za pomocą fs? Nie wiem (proszę, skomentuj, jeśli masz pomysł).

3

można użyć modułu tar-stream aby utworzyć archiwum tar.Jest o wiele bardziej elastyczne i prostsze niż node-tar, że:

  • Możesz dodać pliki do archiwum (nie tylko katalogi, które jest ograniczenie węzła-tar)
  • Współpracuje z normalnych strumieni węzeł systemu plików (node-tar dziwnie wymaga użycia modułu fstream)
  • jest całkiem w pełni udokumentowane (node-tar nie jest dobrze udokumentowane)
  • można utworzyć archiwum bez uderzania plików

utworzyć tar archiwum, a następnie skompresuj go za pomocą zlib, a następnie zapisz go w dowolnym miejscu (sieć, system plików itp.).

+0

Czy możesz dostarczyć dokumentację miejsca, w którym strumień tar mówi/pokazuje, że może używać strumieniowych systemów plików węzła ("fs"). Nie mogę znaleźć żadnego. –

+0

W tym momencie kończę praktykę z tym modułem. Może to pomoże? https://github.com/mafintosh/tar-stream/issues/8 –