2013-04-14 10 views
5

Używam metody extractTo klasy PHP PharData do sprawdzania zawartości pliku phar i uruchamiania niektórych wyników w postaci wyników. Osiągnąłem granice pracy detektywa na poziomie mojego bajtu i miałem nadzieję, że ktoś tutaj pomoże mi to rozwiązać.Jaki format pliku obsługuje PharData :: extractTo Extract Files As?

Szczegóły poniżej, ale ogólnie rzecz biorąc: Kiedy rozpakowuję moje pliki archiwum za pomocą PharData::extractTo, pliki, które otrzymuję, są zmienne bzip, ale polecenie bzip2 ich nie lubi. Czy to normalne zachowanie, czy jest to problem z określonym archiwum? (lub możliwa kombinacja PHP/OS, której używam). Czy istnieje sposób na uzyskanie zwykłych plików tekstowych z archiwum phar - czy domyślny tekst powinien być domyślny i mam na myśli dziwne zachowanie systemu?

Konkretnie, kiedy uruchomić komendę

$phar = new Phar('n98-magerun.phar'); 
$phar->extractTo('/tmp/n98-magerun'); 

Na mojej OS 10.6.8 Intel oparte Mac za pomocą wbudowanego w PHP 5.3.6, archiwum powodzeniem ekstrakcji do/tmp/N98-magerun teczka.

enter image description here

Archiwum jestem wydobycia can be found here.

Jeśli otworzę dowolny z plików tekstowych wyodrębnionych w BBEdit, widzę poprawną zawartość.

enter image description here

Jednak, jeśli mogę użyć innych narzędzi, takich jak QuickLook, vi lub cat widzę danych binarnych. Zauważyłem to, próbując uzyskać ack/grep poprzez zawartość plików i nie otrzymałem oczekiwanych rezultatów.

enter image description here

Jeśli użyję komendy file na pliku, to donosi, że jest to plik bzip.

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k 

i rozpatrywania plik w edytorze hex potwierdza plik zaczyna się BZ nagłówku

enter image description here

jednak próbuje rozpakować plik z bzip2 wyników w następujący błąd

$ bzip2 -d MIT-LICENSE.txt 
bzip2: Can't guess original name for MIT-LICENSE.txt -- using MIT-LICENSE.txt.out 

bzip2: Compressed file ends unexpectedly; 
    perhaps it is corrupted? *Possible* reason follows. 
bzip2: No such file or directory 
    Input file = MIT-LICENSE.txt, output file = MIT-LICENSE.txt.out 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

bzip2: Deleting output file MIT-LICENSE.txt.out, if it exists. 

i mogę bzcat plik pomyślnie, chociaż to barfs w środku dle pliku z tym

bzcat: Compressed file ends unexpectedly; 
    perhaps it is corrupted? *Possible* reason follows. 
bzcat: Undefined error: 0 
    Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 
+0

Czy widziałeś komentarz poniżej http://php.net/manual/en/phardata.extractto.php? Mówi o formacie archiwum "pax" na starszych systemach Mac. –

+0

Widziałem to, ale nie jestem pewien, czy śledzę, jak to działa (jeśli w ogóle). Wydaje się twierdzić, że niektóre starsze wersje PHP w systemie Mac OS generują archiwa phara w stylu pax, ale 'extractTo' obsługuje tylko archiwizację wersji ustar. Ponieważ nie generuję archiwum, a archiwum jest poprawnie wyodrębniane, nie jestem pewien, czy jest to istotne. (przez co mam na myśli, jestem dosłownie nie pewna: wcześniej nie włamałem się na rzeczy phara) –

+0

Przepraszam, mam błąd - po pierwszym przeczytaniu zrozumiałem, że to niektóre systemy (i wspomniałem o Mac OS używają) wyodrębnia pliki do archiwum pax ... –

Odpowiedz

1

Jest to plik bzip2, ale aby go rozpakować, trzeba użyć opcji --stdout (lub -c) (patrz niżej).

Powodem, dla którego potrzebna jest opcja --stdout, plik nie kończy się na rozszerzeniu .bz2, które umożliwiłoby bunzip2 określenie wynikowej nazwy pliku do dekompresji.

$ bunzip2 --stdout MIT-LICENSE.txt 2>/dev/null 
Copyright (c) 2012 netz98 new media GmbH 

http://www.netz98.de 

Permission is hereby granted, free of charge, to any person obtaining 
a copy of this software and associated documentation files (the 
"Software"), to deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, merge, publish, 
distribute, sublicense, and/or sell copies of the Software, and to 
permit persons to whom the Software is furnished to do so, subject to 
the following conditions: 

The above copyright notice and this permission notice shall be 
included in all copies or substantial portions of the Software. 

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE 

nie mam pojęcia dlaczego bunzip2 jest outputing następujące normy błędu:

bzip2: Compressed file ends unexpectedly; 
     perhaps it is corrupted? *Possible* reason follows. 
bzip2: Success 
     Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

W sprawozdaniach file dowodzenia plik jest prawidłowy plik bzip2 o wielkości bloku 400K:

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k 

Próbowałem dodać opcję -4 do bunzip2, ale nadal narzeka:

$ bunzip2 -d -4 -vvvvv -c MIT-LICENSE.txt >/dev/null 
    MIT-LICENSE.txt: 
    [1: huff+mtf rt+rld {0x2010d4b9, 0x2010d4b9}] 
    combined CRCs: stored = 0x2010d4b9, computed = 0x2010d4b9 
    [1: huff+mtf 
bunzip2: Compressed file ends unexpectedly; 
     perhaps it is corrupted? *Possible* reason follows. 
bunzip2: Success 
     Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

więc zgaduję, że przyczyną problemu jest program, który tworzy pliki bzip2.

+0

+1 za pracę detektywa i prawdopodobnie najlepszą możliwą odpowiedź. Wkopałem się w kod PHP 'phar' i znalazłem niezliczoną ilość problemów, które, chociaż nie mogę wskazać, że są przyczyną tych dziwnych plików' bz', wskazują mnie na tandetną implementację jako winowajcę. –

0

Przy użyciu extractTo pliki są przechowywane w tym samym formacie, w jakim znajdują się w archiwum! To może być jedno z: Brak, gzip, bzip2

Choć na pewno można je zapisać w tym formacie, a następnie starają się wydobyć go jakoś, proponuję następujące: Konwersja Phar się z nieskompresowanego Phar i ekstraktu że archiwum!

Oto jak:

<?php 
$phar = new Phar('Someclass.phar'); 
$phar2 = $phar->convertToExecutable (Phar::TAR,Phar::NONE); //convert to an uncompressed tar archive 
$phar2->extractTo('/some/path/'); // extract all files 

To daje wszystkie pliki nieskompresowane!