13.08.2011, 13:41
|
|
Профессор
|
|
Регистрация: 20.07.2009
Сообщений: 202
|
|
php zlib архивировать папку
Поделитесь примером )))
|
|
13.08.2011, 14:13
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
а в чем проблема? На офф сайте например вот есть инфа как упаковать целую директорию, создаешь tar файл, потом его zlib'ом упаковываешь... Не вижу ничего заумного.
|
|
13.08.2011, 16:20
|
|
Профессор
|
|
Регистрация: 20.07.2009
Сообщений: 202
|
|
не, не понял ...везде работа со строками.
|
|
13.08.2011, 16:36
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от cuberboy
|
не, не понял ...везде работа со строками.
|
комментарий смотри ниже там на сайте, там человек показывает как создать TAR файл для последующей его упаковки.
|
|
13.08.2011, 16:50
|
|
Профессор
|
|
Регистрация: 20.07.2009
Сообщений: 202
|
|
дак нашел
<?php
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
// Adds file header to the tar file, it is used before adding file content.
// f: file resource (provided by eg. fopen)
// phisfn: path to file
// archfn: path to file in archive, directory names must be followed by '/'
//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
function TarAddHeader($f,$phisfn,$archfn)
{
$info=stat($phisfn);
$ouid=sprintf("%6s ", decoct($info[4]));
$ogid=sprintf("%6s ", decoct($info[5]));
$omode=sprintf("%6s ", decoct(fileperms($phisfn)));
$omtime=sprintf("%11s", decoct(filemtime($phisfn)));
if (@is_dir($phisfn))
{
$type="5";
$osize=sprintf("%11s ", decoct(0));
}
else
{
$type='';
$osize=sprintf("%11s ", decoct(filesize($phisfn)));
clearstatcache();
}
$dmajor = '';
$dminor = '';
$gname = '';
$linkname = '';
$magic = '';
$prefix = '';
$uname = '';
$version = '';
$chunkbeforeCS=pack("a100a8a8a8a12A12",$archfn, $omode, $ouid, $ogid, $osize, $omtime);
$chunkafterCS=pack("a1a100a6a2a32a32a8a8a155a12", $type, $linkname, $magic, $version, $uname, $gname, $dmajor, $dminor ,$prefix,'');
$checksum = 0;
for ($i=0; $i<148; $i++) $checksum+=ord(substr($chunkbeforeCS,$i,1));
for ($i=148; $i<156; $i++) $checksum+=ord(' ');
for ($i=156, $j=0; $i<512; $i++, $j++) $checksum+=ord(substr($chunkafterCS,$j,1));
fwrite($f,$chunkbeforeCS,148);
$checksum=sprintf("%6s ",decoct($checksum));
$bdchecksum=pack("a8", $checksum);
fwrite($f,$bdchecksum,8);
fwrite($f,$chunkafterCS,356);
return true;
}
|
|
13.08.2011, 16:53
|
|
Профессор
|
|
Регистрация: 20.07.2009
Сообщений: 202
|
|
"нехера" не понял ))) блин на зипе делается всё в пять строчек, а тут что за извращения....ну да ладно вроде должно работать, вопрос чего там в параметрах функции? первый гзфайл, второй путь к файлу который проверяется на директорию т.е. архивируемая директория?
не ясен тогда третий параметр что за путь и нафига..в открытом гз уже передали что и где валяется....
|
|
13.08.2011, 16:55
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Ну там еще две дополнительные функции ниже у него, первая создает заголовок (HEADER) для файла, вторая пихает сам файл (CONTENT) ну а третья закрывает блок файла (FOOTER) и так над каждым файлом, все это пихаешь в один файл, а полученный TAR файл упаковываешь уже Zlib'ом
|
|
13.08.2011, 16:59
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
// f: file resource (provided by eg. fopen) - линк на открытый файл с помощью fopen("blabla.tar", "w");
// phisfn: path to file - где ему искать сам файл, тоесть путь на диске типа "/folder1/folder2/myfile.ext"
// archfn: path to file in archive, directory names must be followed by '/' - тут путь к файлу в архиве типа "/folder1/"
|
|
13.08.2011, 17:06
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
так а почему бы не сделать zip архив в 5 строчек. или обязательно нужен gzip?
$zip = new ZipArchive();
if ($zip->open("archive.zip", ZipArchive::CREATE) !== true) {
die ("Could not open archive");
}
$iterator = new RecursiveDirectoryIterator('test/');
foreach ($iterator as $key => $value) {
$path = pathinfo($value);
if ($path['basename'] == '.' || $path['basename'] == '..') continue;
$zip->addFile(realpath($key), $key);
}
$zip->close();
|
|
13.08.2011, 17:47
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
на вот держи:
<?php
function TarAddHeader( $f, $phisfn, $archfn ) {
$info = stat( $phisfn );
$ouid = sprintf( "%6s ", decoct( $info[ 4 ] ) );
$ogid = sprintf( "%6s ", decoct( $info[ 5 ] ) );
$omode = sprintf( "%6s ", decoct( fileperms( $phisfn ) ) );
$omtime = sprintf( "%11s", decoct( filemtime( $phisfn ) ) );
if ( @is_dir( $phisfn ) ) {
$type = "5";
$osize = sprintf( "%11s ", decoct( 0 ) );
} else {
$type = '';
$osize = sprintf( "%11s ", decoct( filesize( $phisfn ) ) );
clearstatcache();
}
$dmajor = '';
$dminor = '';
$gname = '';
$linkname = '';
$magic = '';
$prefix = '';
$uname = '';
$version = '';
$chunkbeforeCS = pack( "a100a8a8a8a12A12", $archfn, $omode, $ouid, $ogid, $osize, $omtime );
$chunkafterCS = pack( "a1a100a6a2a32a32a8a8a155a12", $type, $linkname, $magic, $version, $uname, $gname, $dmajor, $dminor ,$prefix, '' );
$checksum = 0;
for ( $i = 0; $i < 148; $i++ ) $checksum += ord( substr( $chunkbeforeCS, $i, 1 ) );
for ( $i = 148; $i < 156; $i++ ) $checksum += ord(' ');
for ( $i = 156, $j = 0; $i < 512; $i++, $j++ ) $checksum += ord( substr( $chunkafterCS, $j, 1 ) );
fwrite( $f, $chunkbeforeCS, 148 );
$checksum = sprintf( "%6s ", decoct( $checksum ) );
$bdchecksum = pack( "a8", $checksum );
fwrite( $f, $bdchecksum, 8 );
fwrite( $f, $chunkafterCS, 356 );
return true;
}
function TarWriteContents( $f, $phisfn ) {
if ( @is_dir( $phisfn ) ) {
return;
} else {
$size = filesize( $phisfn );
$padding = $size % 512 ? 512 - $size % 512 : 0;
$f2 = fopen( $phisfn, "rb" );
while ( !feof( $f2 ) ) fwrite( $f, fread( $f2, 1024 * 1024 ) );
fclose( $f2 );
$pstr = sprintf( "a%d", $padding );
fwrite( $f, pack( $pstr, '' ) );
}
}
function TarAddFooter( $f ) {
fwrite( $f, pack( 'a1024', '' ) );
}
function getRecursiveDir( $dir, $archdir = '' ) {
$out = array();
if ( file_exists( $dir ) ) {
if ( is_dir( $dir ) ) {
$getcontent_dir_type = dir( $dir );
while ( false !== ( $entry_type = $getcontent_dir_type->read() ) ) {
if ( ( $entry_type !== '.' ) && ( $entry_type !== '..' ) ) {
$out[] = $archdir.$entry_type;
if ( filetype( $dir."/".$entry_type ) == 'dir')
{
$rec = getRecursiveDir( $dir."/".$entry_type, $archdir.$entry_type.'/' );
$out = array_merge( $out, $rec );
}
}
}
$getcontent_dir_type->close();
}
}
return $out;
}
// тут указываем какую папку хотим засунуть в tar файл
$directory_to_pack = dirname( __FILE__ ).'/forpackdir';
$tar = fopen("mytar.tar", "w");
$files = getRecursiveDir( $directory_to_pack );
foreach( $files as $record ) {
TarAddHeader( $tar, $directory_to_pack.'/'.$record, $record );
TarWriteContents( $tar, $directory_to_pack.'/'.$record );
}
TarAddFooter( $tar );
fclose( $tar );
// ну а потом можно tar файл уже и упаковывать zlib'ом
?>
Последний раз редактировалось devote, 13.08.2011 в 19:18.
|
|
|
|