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