2009-02-03 31 views
8

Tôi đang làm việc trên một dự án sử dụng C++, Boost và Qt. Tôi hiểu làm thế nào để nén các tập tin duy nhất và bytestreams bằng cách sử dụng, ví dụ, các qCompress() chức năng trong Qt.Làm cách nào để nén một thư mục tệp bằng C++?

Làm cách nào để nén một thư mục nhiều tệp, bao gồm các thư mục con? Tôi đang tìm một giải pháp đa nền tảng (Mac, Win, Linux); Tôi không muốn bắn ra một loạt các quy trình mới.

Có cách nào tiêu chuẩn để kết hợp bytestreams từ nhiều tệp vào kho lưu trữ nén hay có thể có chức năng hoặc phương pháp tiện lợi có sẵn trong thư viện Boost iostream?

Rất cám ơn sự hỗ trợ.

Cập nhật: Thư viện QuaZip trông thực sự tuyệt vời. Có một ví dụ trong gói tải xuống (trong thư mục "kiểm tra") hiển thị rất rõ ràng cách nén một thư mục tệp.

Cập nhật 2: Sau khi hoàn thành tác vụ này trên môi trường xây dựng Linux, tôi phát hiện ra rằng QuaZip không hoạt động với trình biên dịch Visual Studio. Nó có thể có khả năng giải quyết tất cả những lỗi trình biên dịch, nhưng một lời cảnh cáo cho bất cứ ai nhìn xuống con đường này.

Trả lời

9

Tôi đã tìm thấy hai thư viện sau:

  • ZipIOS++. Dường như là "tinh khiết" C++. Họ không liệt kê Windows rõ ràng là nền tảng được hỗ trợ. Vì vậy, tôi nghĩ bạn nên thử vận ​​may của mình.
  • QuaZIP. Dựa trên Qt4. Trên thực tế có vẻ tốt đẹp. Họ liệt kê Windows một cách rõ ràng (Sử dụng mingw). Rõ ràng, nó là một trình bao bọc C++ cho thư viện [this] này.

Ah, và dĩ nhiên, tôi đã xé những trang web từ this Qt mailinglist câu hỏi về Nén/giải nén các thư mục :)

+0

Tôi thứ hai QuaZIP. –

+0

QuaZip trông giống như con đường để đi. Cảm ơn! – martian

+0

ZipIOS ++ không có tệp dự án MSVC 6. Tuy nhiên, nó mượn một số mã từ Boost.Filesystem (tính đến năm 2001!), Mà không thực sự biên dịch ra khỏi hộp, ít nhất là trong môi trường VS2008 của tôi. Vì vậy, tôi đoán tôi cũng sẽ phải xem QuaZIP, hoặc đồng bằng zlib ... – Reunanen

-1
system("zip myarchive.zip *"); 
+0

Anh ấy nói anh ấy không muốn kích hoạt các quy trình mới. – PolyThinker

+0

Đây chỉ là một quá trình bổ sung và nhanh hơn nhiều so với việc sử dụng thư viện của bên thứ ba. Nhưng, tôi không biết lý do không muốn khởi chạy một quá trình khác, có lẽ OP có bộ nhớ rất hạn chế hoặc muốn kiểm soát nhiều hơn ZIP khi nó đang chạy nhưng đây là cách tôi sẽ làm điều đó. –

+1

nó không phải là một câu hỏi của sinh sản quy trình mới. câu trả lời này chỉ đơn giản là không biết gì. nếu "zip" không được cài đặt thì những nền tảng khác thì unix thì sao? –

1
+0

Theo như tôi biết, zlib chỉ hỗ trợ tệp .gz chứ không phải tệp .zip. –

+0

Vâng, tôi đang tìm .zip. Thư viện minizip được liên kết từ trang zlib.net có thể giúp đỡ, nhưng tôi cần tìm hiểu thêm một chút ... Nếu có ai biết thêm về thư viện này, tôi rất cảm kích khi nghe về nó. – martian

+0

Bạn có thực sự nén toàn bộ thư mục bằng zlib không? Hoặc chỉ một tệp? – Frank

1

Chỉ cần cho các hồ sơ ...

Hôm nay, tôi cần thiết để làm một cái gì đó rất giống nhau trong Visual C++. (Mặc dù muốn duy trì khả năng biên dịch dự án trên các nền tảng khác, tuy nhiên không ưa thích áp dụng Qt chỉ cho mục đích này.)

Đã kết thúc bằng cách sử dụng thư viện Minizip. Nó được viết bằng đồng bằng C, nhưng tạo ra một wrapper C++ đơn giản xung quanh nó là một khoe, và kết quả cuối cùng hoạt động tuyệt vời, ít nhất là cho các mục đích của tôi.

0

Tôi đã thử QuaZIP 0.4.3 trên Windows bằng VisualStudio 2010 - vẫn còn sự cố nhưng có thể được giải quyết dễ dàng.

Để xây dựng với VS:

  1. Sử dụng CMake để cấu hình và tạo ra giải pháp VS cho QuaZIP.
  2. Giải quyết mở với VS và xây dựng - trước tiên bạn sẽ nhận thấy rằng nó không thể tìm thấy 'zlib.h'.
  3. Mở tùy chọn cho dự án qua zip và thêm đường dẫn tới bản sao Zlib của Qt vào C/C++ -> Chung-> Thư mục bao gồm bổ sung: $ (QTDIR)/src/3rdparty/zlib.
  4. Tạo lại và bạn sẽ nhận được rất nhiều cảnh báo và một lỗi C2491: dllimport vấn đề tĩnh trên QuaZipFile :: staticMetaObject.
  5. Điều này là do QuaZipFile được khai báo là "class QUAZIP_EXPORT QuaZipFile" và QUAZIP_EXPORT cần phải giải quyết thành Q_DECL_EXPORT cho dll và đến Q_DECL_IMPORT cho ứng dụng, dựa trên việc QUAZIP_BUILD có được xác định hay không. Khi xây dựng QuaZIP QUAZIP_BUILD nên được xác định nhưng không phải là - quá trình cấu hình định nghĩa trong lỗi hoàn toàn vô dụng "quazip_EXPORTS" thay thế.
  6. Để khắc phục, chỉ cần xóa "quazip_EXPORTS" khỏi tất cả các cấu hình xây dựng và thêm QUAZIP_BUILD để thay thế - QuaZIP giờ đây sẽ hoạt động tốt.
0

Tôi đã tạo một trình bao bọc xung quanh minizip thêm một số tính năng mà tôi cần và làm cho nó đẹp hơn để sử dụng nó. Là không sử dụng C++ 11 mới nhất và được phát triển bằng cách sử dụng Visual Studio 2013, vì vậy nó sẽ làm việc out-of-the-box cho bạn.

Có một mô tả đầy đủ ở đây: https://github.com/sebastiandev/zipper

bạn có thể nén toàn bộ thư mục, suối, vectơ, vv Ngoài ra một tính năng tuyệt vời đang làm tất cả mọi thứ hoàn toàn trong bộ nhớ.

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