2009-07-21 9 views
6

Piszę wtyczkę do przeglądarki, podobną do Flasha i Javy, ponieważ zaczyna pobierać plik (.jar lub .swf), gdy tylko zostanie wyświetlony. Java czeka (myślę), dopóki nie zostaną załadowane wszystkie pliki jar, ale Flash nie. Chcę tę samą zdolność, ale ze skompresowanym plikiem archiwum. Chciałbym uzyskać dostęp do plików w archiwum, gdy tylko zostaną pobrane bajty niezbędne do ich dekompresji.Dekompresja i ekstrakcja plików z archiwum strumieniowego w locie

Na przykład pobieram archiwum do bufora pamięci, a jak tylko pierwszy plik jest możliwy do rozpakowania, chcę go rozpakować (również do bufora pamięci).

Czy są jakieś formaty/biblioteki, które obsługują to?

EDYCJA: W miarę możliwości wolałbym format pojedynczego pliku zamiast oddzielnego do kompresji i archiwizacji, jak gz/bzip2 i tar.

+0

jakie rozwiązanie znalazłeś? –

Odpowiedz

6

Są 2 problemy tutaj

  1. Jak napisać kod.

  2. Jaki format użyć.

W formacie pliku nie można używać formatu .ZIP, ponieważ .ZIP umieszcza spis treści na końcu pliku. Oznacza to, że musisz pobrać cały plik, zanim będziesz wiedział, co w nim jest. Zip ma nagłówki, które możesz skanować, ale te nagłówki nie są oficjalną listą tego, co znajduje się w pliku.

Program Zip jawnie umieszcza spis treści na końcu, ponieważ umożliwia szybkie dodawanie plików.

Załóżmy, że masz plik zip zawierający pliki "a", "b" i "c". Chcesz zaktualizować "c". Jest on całkowicie poprawny w pliku zip, aby odczytać spis treści, dołączyć nowy c, napisać nowy spis treści wskazujący na nowe "c", ale stare "c" jest nadal w pliku. Jeśli wyszukujesz nagłówki, zobaczysz stare "c", ponieważ wciąż znajduje się w pliku.

Ta funkcja dołączania była wyraźnym celem projektu zip. Pochodzi z lat 80., kiedy zip mógł objąć wiele dyskietek. Jeśli chciałbyś dodać plik, musiałby przeczytać wszystkie N-płyty tylko po to, aby ponownie zapisać cały plik zip. Zamiast tego format po prostu pozwala na dołączenie zaktualizowanych plików do końca, co oznacza, że ​​potrzebuje tylko ostatniej płyty. Po prostu czyta stary spis treści, dołącza nowe pliki, pisze nowy spis treści.

Gzipowane pliki tar nie mają tego problemu.Pliki tar są przechowywane w nagłówku, pliku, pliku nagłówkowym, a kompresja jest na wierzchu, więc możliwe jest rozpakowanie jako plik, który jest pobrany i użycie plików, gdy tylko będą dostępne. Możesz tworzyć spakowane pliki gatu z łatwością w oknach za pomocą WinRAR (komercyjny) lub 7-zip (bezpłatny), a na Linux, osx i cygwin użyj polecenia tar.

na kodzie pisać,

O3D to robi i jest open source, dzięki czemu można spojrzeć na kod http://o3d.googlecode.com

Kod dekompresji jest w O3D/Import/cross/...

Skierowany jest na NPAPI za pomocą kleju, który można znaleźć w o3d/plugin/cross

2

Na przykład zlib na przykład używa z_stream do przyrostowej kompresji i dekompresji za pomocą funkcji inflateInit, inflate, deflateInit, deflate. libzip2 ma podobne umiejętności.

W celu przyrostowego wyodrębniania z archiwum (ponieważ jest deflowany), patrz np. do starego dobrego formatu tar.

5

Zapoznaj się z boost::zlib filters. Sprawiają, że używanie zlib jest bardzo łatwe.

Oto próbka z docs przypominającego, że będą dekompresji pliku i zapisać go do konsoli:

#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); 
} 
Powiązane problemy