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

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

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

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

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

	//look for invalid block size
	if (strlen($binary_data) != 26)
	{
		$arHeader['filename'] = "";
		$arHeader['status'] = "invalid_header";

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

	//extract values
	$data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);

	$arHeader['filename'] = fread($this->zipfile, $data['filename_len']);

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

	//extract properties
	$arHeader['compression'] = $data['compression'];
	$arHeader['size'] = $data['size'];
	$arHeader['compressed_size'] = $data['compressed_size'];
	$arHeader['crc'] = $data['crc'];
	$arHeader['flag'] = $data['flag'];

	//save date in unix format
	$arHeader['mdate'] = $data['mdate'];
	$arHeader['mtime'] = $data['mtime'];

	if ($arHeader['mdate'] && $arHeader['mtime'])
	{
		//extract 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;

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

	//to be checked: for(reset($data); $key = key($data); next($data)) { }
	$arHeader['stored_filename'] = $arHeader['filename'];
	$arHeader['status'] = "ok";

	return $res;
}