2012-03-23 33 views
5

Tôi đang cố gắng sử dụng Node.js để tạo một tệp zip từ một thư mục hiện có và duy trì cấu trúc.Tạo một kho lưu trữ zip từ một thư mục và giữ nguyên cấu trúc với Node.js

Tôi đã hy vọng sẽ có một module đơn giản để cho phép loại điều:

archiver.create("../folder", function(zipFile){ 
    console.log('et viola'); 
}); 

nhưng tôi không thể tìm thấy bất cứ điều gì của các loại!

Tôi đã googling xung quanh, và tốt nhất tôi đã tìm thấy cho đến nay là zipstream, nhưng theo như tôi có thể nói không có cách nào để làm những gì tôi muốn. Tôi không thực sự muốn gọi vào các tiện ích dòng lệnh, vì ứng dụng phải là nền tảng chéo.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn.

Trả lời

2

Nó không hoàn toàn miễn phí, nhưng bạn có thể sử dụng node-native-zip kết hợp với folder.js. Cách sử dụng:

function zipUpAFolder (dir, callback) { 
    var archive = new zip(); 

    // map all files in the approot thru this function 
    folder.mapAllFiles(dir, function (path, stats, callback) { 
     // prepare for the .addFiles function 
     callback({ 
      name: path.replace(dir, "").substr(1), 
      path: path 
     }); 
    }, function (err, data) { 
     if (err) return callback(err); 

     // add the files to the zip 
     archive.addFiles(data, function (err) { 
      if (err) return callback(err); 

      // write the zip file 
      fs.writeFile(dir + ".zip", archive.toBuffer(), function (err) { 
       if (err) return callback(err); 

       callback(null, dir + ".zip"); 
      });      
     }); 
    });  
} 
+0

Cảm ơn rất nhiều! Mã zip được tạo, nhưng tiếc là nó bị hỏng và xuất hiện trống. Tôi sẽ chơi đùa với nó và thử xem vấn đề là gì. – user1257359

+0

Trên thực tế, nó chỉ có vẻ là * hơi * bị hỏng;) Khi tôi thử và khám phá zip đã tạo, nó xuất hiện trống, nhưng khi tôi giải nén nó, nội dung trông ổn. Cảm ơn câu trả lời tuyệt vời, nhanh chóng! – user1257359

+0

Làm việc như một sự quyến rũ! – Tim

1

Điều này có thể được thực hiện đơn giản hơn bằng chức năng execfile tích hợp của nút. Nó sinh ra một tiến trình và thực thi lệnh zip thông qua os, nguyên bản. Mọi thứ đều hoạt động.

var execFile = require('child_process').execFile; 

execFile('zip', ['-r', '-j', zipName, pathToFolder], function(err, stdout) { 
     console.log(err); 
     logZipFile(localPath); 
    }); 

Cờ -j 'kẹt' đường dẫn tệp, nếu bạn đang nén thư mục con và không muốn lồng vào nhau trong tệp zip.

Đây là some documentation on execfile. Đây là a man page for zip.

+0

Các op cụ thể cho biết họ muốn bản địa và nền tảng chéo và không một cuộc gọi dòng lệnh. – JohnC

-1

Sử dụng Easy-zip, npm install easy-zip, bạn có thể làm:

var zip5 = new EasyZip(); 
zip5.zipFolder('../easy-zip',function(){ 
    zip5.writeToFile('folderall.zip'); 
}); 
+1

Tôi sẽ không khuyên bạn nên sử dụng điều này vì [vấn đề này] (https://github.com/owenchong/easy-zip/issues/2). – rax

+0

Gần đây tôi đã sử dụng 'easy-zip' gần đây và chưa gặp phải sự cố mà @rax đã đánh dấu. – developius

Các vấn đề liên quan