• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/zip.php
  • Класс: CZip
  • Вызов: CZip::_readCentralFileHeader
private function _readCentralFileHeader(&$arHeader)
{
	$res = 1;

	//reading 4 bytes signature
	$binary_data = @fread($this->zipfile, 4);

	$data = unpack('Vid', $binary_data);

	//checking signature
	if ($data['id'] != 0x02014b50)
	{
		$this->_errorLog("ERR_BAD_FORMAT", GetMessage("MAIN_ZIP_ERR_STRUCT"));
		return $this->arErrors;
	}

	//reading first header 42 bytes
	$binary_data = fread($this->zipfile, 42);

	//if block size is not valid
	if (strlen($binary_data) != 42)
	{
		$arHeader['filename'] = "";
		$arHeader['status'] = "invalid_header";

		$this->_errorLog("ERR_BAD_BLOCK_SIZE", str_replace("#SIZE#", $binary_data, GetMessage("MAIN_ZIP_ERR_BLOCK_SIZE")));
		return $this->arErrors;
	}

	//extract values
	$arHeader = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data);

	//getting filename
	if ($arHeader['filename_len'] != 0)
	{
		$arHeader['filename'] = fread($this->zipfile, $arHeader['filename_len']);
	}
	else
	{
		$arHeader['filename'] = '';
	}

	//getting extra
	if ($arHeader['extra_len'] != 0)
	{
		$arHeader['extra'] = fread($this->zipfile, $arHeader['extra_len']);
	}
	else
	{
		$arHeader['extra'] = '';
	}

	//getting comments
	if ($arHeader['comment_len'] != 0)
	{
		$arHeader['comment'] = fread($this->zipfile, $arHeader['comment_len']);
	}
	else
	{
		$arHeader['comment'] = '';
	}

	//extracting properties

	//saving date in unix format
	if ($arHeader['mdate'] && $arHeader['mtime'])
	{
		//extracting time
		$hour = ($arHeader['mtime'] & 0xF800) >> 11;
		$min = ($arHeader['mtime'] & 0x07E0) >> 5;
		$sec = ($arHeader['mtime'] & 0x001F) * 2;

		//...and date
		$year = (($arHeader['mdate'] & 0xFE00) >> 9) + 1980;
		$month = ($arHeader['mdate'] & 0x01E0) >> 5;
		$day = $arHeader['mdate'] & 0x001F;

		//in unix date format
		$arHeader['mtime'] = mktime($hour, $min, $sec, $month, $day, $year);
	}
	else
	{
		$arHeader['mtime'] = time();
	}

	//set stored filename
	$arHeader['stored_filename'] = $arHeader['filename'];

	//default status is 'ok'
	$arHeader['status'] = 'ok';

	//is directory?
	if (mb_substr($arHeader['filename'], -1) == '/')
	{
		$arHeader['external'] = 0x41FF0010;
	}

	return $res;
}