Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2011, 13:41
Аватар для cuberboy
Профессор
Отправить личное сообщение для cuberboy Посмотреть профиль Найти все сообщения от cuberboy
 
Регистрация: 20.07.2009
Сообщений: 202

php zlib архивировать папку
Поделитесь примером )))
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2011, 14:13
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

а в чем проблема? На офф сайте например вот есть инфа как упаковать целую директорию, создаешь tar файл, потом его zlib'ом упаковываешь... Не вижу ничего заумного.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2011, 16:20
Аватар для cuberboy
Профессор
Отправить личное сообщение для cuberboy Посмотреть профиль Найти все сообщения от cuberboy
 
Регистрация: 20.07.2009
Сообщений: 202

не, не понял ...везде работа со строками.
Ответить с цитированием
  #4 (permalink)  
Старый 13.08.2011, 16:36
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от cuberboy
не, не понял ...везде работа со строками.
комментарий смотри ниже там на сайте, там человек показывает как создать TAR файл для последующей его упаковки.
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2011, 16:50
Аватар для cuberboy
Профессор
Отправить личное сообщение для cuberboy Посмотреть профиль Найти все сообщения от cuberboy
 
Регистрация: 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;
}
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2011, 16:53
Аватар для cuberboy
Профессор
Отправить личное сообщение для cuberboy Посмотреть профиль Найти все сообщения от cuberboy
 
Регистрация: 20.07.2009
Сообщений: 202

"нехера" не понял ))) блин на зипе делается всё в пять строчек, а тут что за извращения....ну да ладно вроде должно работать, вопрос чего там в параметрах функции? первый гзфайл, второй путь к файлу который проверяется на директорию т.е. архивируемая директория?
не ясен тогда третий параметр что за путь и нафига..в открытом гз уже передали что и где валяется....
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2011, 16:55
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Ну там еще две дополнительные функции ниже у него, первая создает заголовок (HEADER) для файла, вторая пихает сам файл (CONTENT) ну а третья закрывает блок файла (FOOTER) и так над каждым файлом, все это пихаешь в один файл, а полученный TAR файл упаковываешь уже Zlib'ом
Ответить с цитированием
  #8 (permalink)  
Старый 13.08.2011, 16:59
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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/"
Ответить с цитированием
  #9 (permalink)  
Старый 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();
Ответить с цитированием
  #10 (permalink)  
Старый 13.08.2011, 17:47
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Запуск выполнения PHP при нажатие на кнопку??? Abibas220 Общие вопросы Javascript 1 05.01.2011 12:05
Как передать картинку из javascript в php KIVagant AJAX и COMET 3 12.05.2010 11:54
jquery, php, json… ? незнайка jQuery 4 06.02.2010 01:45
javascript и php (Вопрос) Гауляйтер Общие вопросы Javascript 3 06.05.2009 09:23