• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/volume/cleaner.php
  • Класс: BitrixDiskVolumeCleaner
  • Вызов: Cleaner::deleteTrashcanByFilter
public function deleteTrashcanByFilter(VolumeIVolumeIndicator $indicator): bool
{
	$subTaskDone = true;
	$task = $this->instanceTask();

	$filter = [
		'!DELETED_TYPE' => DiskInternalsObjectTable::DELETED_TYPE_NONE
	];
	if ($task->getLastFileId() > 0)
	{
		$filter['>=ID'] = $task->getLastFileId();
	}

	$indicator->setLimit(self::MAX_FILE_PER_INTERACTION);

	$fileList = $indicator->getCorrespondingFileList($filter);

	$task->setIterationFileCount($fileList->getSelectedRowsCount());

	$countFileErasure = 0;

	foreach ($fileList as $row)
	{
		$fileId = $row['ID'];
		$file = DiskFile::getById($fileId);
		if ($file instanceof DiskFile)
		{
			$securityContext = $this->getSecurityContext($this->getOwner(), $file);
			if($file->canDelete($securityContext))
			{
				$this->deleteFile($file);
				$countFileErasure ++;
			}
			else
			{
				$this->collectError(new Error("Access denied to file #$fileId", 'ACCESS_DENIED'));
			}
		}

		$task->setLastFileId($fileId);

		// fix interval task state
		if ($countFileErasure >= self::STATUS_FIX_INTERVAL)
		{
			$countFileErasure = 0;

			if ($task->hasUserCanceled())
			{
				$subTaskDone = false;
				break;
			}

			$task->fixState();

			// count statistic for progress bar
			self::countWorker((int)$task->getOwnerId());
		}

		if (!$this->checkTimeEnd())
		{
			$subTaskDone = false;
			break;
		}
	}

	$indicator->setLimit(self::MAX_FOLDER_PER_INTERACTION);

	$folderList = $indicator->getCorrespondingFolderList(['!DELETED_TYPE' => DiskInternalsObjectTable::DELETED_TYPE_NONE]);

	foreach ($folderList as $row)
	{
		$folder = DiskFolder::getById($row['ID']);
		if ($folder instanceof DiskFolder)
		{
			$this->deleteFolder($folder);
			$countFileErasure ++;
		}

		// fix interval task state
		if ($countFileErasure >= self::STATUS_FIX_INTERVAL)
		{
			$countFileErasure = 0;

			if ($task->hasUserCanceled())
			{
				$subTaskDone = false;
				break;
			}

			$task->fixState();

			// count statistic for progress bar
			self::countWorker((int)$task->getOwnerId());
		}

		if (!$this->checkTimeEnd())
		{
			$subTaskDone = false;
			break;
		}
	}

	return $subTaskDone;
}