php zlib архивировать папку
Поделитесь примером )))
|
а в чем проблема? На офф сайте например вот есть инфа как упаковать целую директорию, создаешь tar файл, потом его zlib'ом упаковываешь... Не вижу ничего заумного.
|
не, не понял ...везде работа со строками.
|
Цитата:
|
дак нашел
<?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; } |
"нехера" не понял ))) блин на зипе делается всё в пять строчек, а тут что за извращения....ну да ладно вроде должно работать, вопрос чего там в параметрах функции? первый гзфайл, второй путь к файлу который проверяется на директорию т.е. архивируемая директория?
не ясен тогда третий параметр что за путь и нафига..в открытом гз уже передали что и где валяется.... |
Ну там еще две дополнительные функции ниже у него, первая создает заголовок (HEADER) для файла, вторая пихает сам файл (CONTENT) ну а третья закрывает блок файла (FOOTER) и так над каждым файлом, все это пихаешь в один файл, а полученный TAR файл упаковываешь уже Zlib'ом
|
// 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/" |
так а почему бы не сделать 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(); |
на вот держи:
<?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'ом ?> |
Часовой пояс GMT +3, время: 18:52. |