- Модуль: 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;
}