2013-03-20 5 views
16

Ich tauche in Zlib von node.js. Ich konnte Dateien komprimieren und dekomprimieren, indem ich die mitgelieferten Beispiele benutzte (http://nodejs.org/api/zlib.html#zlib_examples), aber ich konnte nicht mehr darüber finden, das Gleiche für Ordner zu tun?Node.js - Zip/Entpacken Sie einen Ordner

Eine Möglichkeit (aber, die ich als basteln betrachte) ist node-zip Modul zu verwenden und alle Dateien des Ordners eins nach dem anderen hinzuzufügen. Aber ich habe ein Problem beim Dekomprimieren (ich werde die Ordner in diesem Fall verlieren).

Gibt es eine Idee, wie man einen ganzen Ordner (unter Berücksichtigung der Unter-Loter-Hierarchie) mit Node.js komprimiert (und dann dekomprimiert)?

Danke.

+1

Zlib ist nur Commression, Sie wollen einen Ordner tar dann komprimieren Sie es, die ganze tar.gz Sache, versuchen Sie https://github.com/isaacs/node-tar – generalhenry

+0

Oh, ich verstehe! Also, ich muss es in zwei Schritten tun: 1/Konvertiere den Ordner in eine '.tar' Datei, dann 2/Komprimiere die' .tar' Datei in '.tar.gz' mit der Zlib. Das 'node-tar' Modul ist nicht sehr gut dokumentiert, haben Sie zusätzliche Ressourcen? – htaidirt

+1

Ich schaute, das Beste, was ich fand, ist https://github.com/cthackers/adm-zip – generalhenry

Antwort

25

ich es endlich habe, mit Hilfe von @generalhenry (siehe Bemerkungen zu der Frage) und

wie in den Kommentaren erwähnt, müssen wir den Ordner, in zwei Schritten komprimieren:

  1. Konvertieren Sie den Ordner in eine Datei .tar

  2. die

.tar Datei komprimieren

Um den ersten Schritt auszuführen, brauchte ich zwei node.js Module:

npm install tar 
npm install fstream 

Die ersten uns .tar Dateien erstellen kann. Sie können hier auf den Quellcode zugreifen https://github.com/isaacs/node-tar

Das zweite Knotenmodul hilft uns, einen Ordner zu lesen und eine Datei zu schreiben. Was das grundlegende Modul fs node.js betrifft, weiß ich nicht, ob es möglich ist, ein Verzeichnis zu lesen (ich spreche nicht davon, alle Dateien in einem Array unter Verwendung von fs.readdir zu bekommen, sondern alle Dateien und ihre Organisation in Ordnern zu behandeln).

Wenn ich dann den Ordner in .tar Datei umwandel, kann ich es mit Gzip() von Zlib komprimieren. Hier

ist der endgültige Code:

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 */ 

Das half mir einen ganzen Ordner mit node.js zu komprimieren

2 weitere Dinge:

  • Wie Sie sehen können, gibt ist ein Mangel an Dokumentation auf tar Modul. Ich hoffe, dass dies bald verbessert wird, da die zwei Beispiele, die bereitgestellt wurden, darüber sprechen, wie Inhalte aus der Datei .tar extrahiert werden können.

  • Ich habe das Modul fstream verwendet, um mit dem Quellverzeichnis umzugehen. Kann dies unter Verwendung von fs umgangen werden? Ich weiß es nicht (bitte kommentieren Sie, wenn Sie eine Idee haben).

3

Sie können das Modul tar-stream verwenden, um ein tar-Archiv zu erstellen.Es ist viel flexibler und einfacher als Knoten-tar, dass:

  • Sie Dateien in das Archiv hinzufügen können (nicht nur Verzeichnisse, die eine Begrenzung der Knoten-Teer ist)
  • Es funktioniert mit normalen Knoten Dateisystem-Streams (node-tar erfordert seltsam die Verwendung des fstream Modul)
  • Seine ziemlich vollständig dokumentiert (node-Teer ist nicht gut dokumentiert)
  • Sie ein Archiv erstellen können, ohne das Dateisystem zu schlagen

erstellen die Teer archivieren, komprimieren Sie es dann mit zlib und schreiben Sie es dann wo Sie wollen (Netzwerk, Dateisystem, etc).

+0

Kannst du Dokumentation von, wo tar-stream sagt, dass es knoten Dateisystem ('fs') Streams verwenden kann. Ich kann keine finden. –

+0

Ich bin mit diesem Modul an dieser Stelle weit aus der Übung. Vielleicht wird das helfen? https://github.com/mafintosh/tar-stream/issues/8 –