• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/mysql/cml2.php
  • Класс: CIBlockXMLFile
  • Вызов: CIBlockXMLFile::safeUnZip
static function safeUnZip(string $fileName, ?int $lastIndex = null, int $interval = 0): array
{
	$result = [
		'STATUS' => self::UNPACK_STATUS_FINAL,
		'DATA' => []
	];

	$startTime = time();

	$dirName = mb_substr($fileName, 0, mb_strrpos($fileName, '/') + 1);
	if (mb_strlen($dirName) <= mb_strlen($_SERVER['DOCUMENT_ROOT']))
	{
		$result['STATUS'] = self::UNPACK_STATUS_ERROR;

		return $result;
	}

	/** @var CZip $archiver */
	$archiver = CBXArchive::GetArchive($fileName, 'ZIP');
	if (!($archiver instanceof IBXArchive))
	{
		$result['STATUS'] = self::UNPACK_STATUS_ERROR;

		return $result;
	}

	if ($lastIndex !== null && $lastIndex < 0)
	{
		$lastIndex = null;
	}

	$archiveProperties = $archiver->GetProperties();
	if (!is_array($archiveProperties))
	{
		$result['STATUS'] = self::UNPACK_STATUS_ERROR;

		return $result;
	}
	if (!isset($archiveProperties['nb']))
	{
		$result['STATUS'] = self::UNPACK_STATUS_ERROR;

		return $result;
	}
	$entries = (int)$archiveProperties['nb'];
	for ($index = 0; $index < $entries; $index++)
	{
		if ($lastIndex !== null)
		{
			if ($lastIndex >= $index)
			{
				continue;
			}
		}

		$archiver->SetOptions([
			'RULE' => [
				'by_index' => [
					[
						'start' => $index,
						'end' => $index,
					]
				]
			]
		]);

		$stepResult = $archiver->Unpack($dirName);
		if ($stepResult === true)
		{
			return $result;
		}
		if ($stepResult === false)
		{
			$result['STATUS'] = self::UNPACK_STATUS_ERROR;

			return $result;
		}

		if ($interval > 0 && (time() - $startTime) > $interval)
		{
			$result['STATUS'] = self::UNPACK_STATUS_CONTINUE;
			$result['DATA']['LAST_INDEX'] = $index;

			return $result;
		}
	}

	return $result;
}