2009-07-21 38 views
6

Tôi đang viết một plugin trình duyệt, tương tự như Flash và Java ở chỗ nó bắt đầu tải xuống tệp (.jar hoặc .swf) ngay sau khi được hiển thị. Java chờ đợi (tôi tin) cho đến khi toàn bộ tệp jar được tải, nhưng Flash thì không. Tôi muốn có cùng khả năng, nhưng với một tệp nén được lưu trữ. Tôi muốn truy cập các tập tin trong kho lưu trữ ngay sau khi các byte cần thiết cho giải nén của họ được tải xuống. Ví dụ: Tôi đang tải kho lưu trữ vào bộ nhớ đệm, và ngay khi tệp đầu tiên có thể giải nén, tôi muốn có thể giải nén nó (cũng vào bộ nhớ đệm).Giải nén và trích xuất các tệp từ lưu trữ trực tuyến khi đang bay

Có định dạng/thư viện nào hỗ trợ điều này không?

EDIT: Nếu có thể, tôi muốn một định dạng tệp duy nhất thay vì định dạng tệp riêng biệt cho nén và lưu trữ, như gz/bzip2 và tar.

+0

bạn đã tìm thấy giải pháp nào? –

Trả lời

6

Có 2 vấn đề ở đây

  1. Làm thế nào để viết mã.

  2. Định dạng sẽ sử dụng.

Ở định dạng tệp, Bạn không thể sử dụng định dạng .ZIP vì .ZIP đặt mục lục ở cuối tệp. Điều đó có nghĩa là bạn phải tải xuống toàn bộ tệp trước khi bạn có thể biết nội dung trong đó. Zip có tiêu đề bạn có thể quét nhưng các tiêu đề đó không phải là danh sách chính thức của những gì trong tệp.

Zip đặt rõ ràng mục lục ở cuối vì nó cho phép thêm nhanh tệp.

Giả sử bạn có tệp zip chứa các tệp 'a', 'b' và 'c'. Bạn muốn cập nhật 'c'. Nó hoàn toàn hợp lệ trong zip để đọc bảng nội dung, thêm c mới, viết một bảng nội dung mới trỏ đến 'c' mới nhưng chữ 'c' cũ vẫn còn trong tệp. Nếu bạn quét tìm tiêu đề, bạn sẽ thấy 'c' cũ vì nó vẫn còn trong tệp.

Tính năng bổ sung này là mục tiêu thiết kế rõ ràng của zip. Nó xuất phát từ những năm 1980 khi một zip có thể kéo dài nhiều đĩa mềm. Nếu bạn cần phải thêm một tập tin nó sẽ hút phải đọc tất cả N đĩa chỉ để viết lại toàn bộ tập tin zip. Vì vậy, thay vì định dạng chỉ cho phép bạn nối thêm các tập tin cập nhật vào cuối có nghĩa là nó chỉ cần đĩa cuối cùng. Nó chỉ đọc TOC cũ, gắn thêm các tệp mới, viết một TOC mới.

Tệp tar đã giải nén không gặp sự cố này.Tar tập tin được lưu trữ tiêu đề, tập tin, tập tin tiêu đề, và nén là trên đầu trang vì vậy nó có thể giải nén như tập tin nó tải về và sử dụng các tập tin khi họ trở nên có sẵn. Bạn có thể tạo các tệp tar gzipped dễ dàng trong các cửa sổ bằng cách sử dụng winrar (thương mại) hoặc 7-zip (miễn phí) và trên linux, osx và cygwin sử dụng lệnh tar.

Trên code để viết,

O3D thực hiện điều này và là mã nguồn mở, do đó bạn có thể nhìn vào mã http://o3d.googlecode.com

Mã giải nén là trong O3D/nhập khẩu/chéo/...

Nó nhắm mục tiêu NPAPI bằng cách sử dụng một số keo có thể được tìm thấy trong o3d/plugin/cross

2

Chắc chắn, zlib ví dụ sử dụng z_stream để nén và giải nén gia tăng thông qua hàm inflateInit, inflate, deflateInit, deflate. libzip2 có khả năng tương tự.

Để trích xuất gia tăng từ lưu trữ (vì nó bị xì hơi), ví dụ: với định dạng cũ tar.

5

Khám phá boost::zlib filters. Họ thực hiện bằng cách sử dụng zlib một snap.

Dưới đây là các mẫu từ các tài liệu tăng mà sẽ giải nén một tập tin và viết nó ra cửa sổ Console:

#include <fstream> 
#include <iostream> 
#include <boost/iostreams/filtering_streambuf.hpp> 
#include <boost/iostreams/copy.hpp> 
#include <boost/iostreams/filter/zlib.hpp> 

int main() 
{ 
    using namespace std; 

    ifstream file("hello.z", ios_base::in | ios_base::binary); 
    filtering_streambuf<input> in; 
    in.push(zlib_decompressor()); 
    in.push(file); 
    boost::iostreams::copy(in, cout); 
} 
Các vấn đề liên quan