コード例 #1
0
 /**
  * Deletes file from storage
  *
  * @param string $sFile
  *
  * @return bool
  */
 public function Delete($sFile)
 {
     if (strpos($sFile, '*')) {
         $bResult = F::File_DeleteAs($sFile);
     } else {
         $bResult = F::File_Delete($sFile);
     }
     if ($bResult) {
         // if folder is empty then remove it
         if (!F::File_ReadDir($sDir = dirname($sFile))) {
             F::File_RemoveDir($sDir);
         }
     }
     return $bResult;
 }
コード例 #2
0
ファイル: Topic.class.php プロジェクト: AlexSSN/altocms
 /**
  * Обработка дополнительных полей топика
  *
  * @param ModuleTopic_EntityTopic $oTopic
  * @param string $sType
  *
  * @return bool
  */
 public function processTopicFields($oTopic, $sType = 'add')
 {
     /** @var ModuleTopic_EntityContentValues $aValues */
     $aValues = array();
     if ($sType == 'update') {
         // * Получаем существующие значения
         if ($aData = $this->GetTopicValuesByArrayId(array($oTopic->getId()))) {
             $aValues = $aData[$oTopic->getId()];
         }
         // * Чистим существующие значения
         E::ModuleTopic()->DeleteTopicValuesByTopicId($oTopic->getId());
     }
     if ($oType = E::ModuleTopic()->GetContentTypeByUrl($oTopic->getType())) {
         //получаем поля для данного типа
         if ($aFields = $oType->getFields()) {
             foreach ($aFields as $oField) {
                 $sData = null;
                 if (isset($_REQUEST['fields'][$oField->getFieldId()]) || isset($_FILES['fields_' . $oField->getFieldId()]) || $oField->getFieldType() == 'single-image-uploader') {
                     //текстовые поля
                     if (in_array($oField->getFieldType(), array('input', 'textarea', 'select'))) {
                         $sData = E::ModuleText()->Parser($_REQUEST['fields'][$oField->getFieldId()]);
                     }
                     //поле ссылки
                     if ($oField->getFieldType() == 'link') {
                         $sData = $_REQUEST['fields'][$oField->getFieldId()];
                     }
                     //поле даты
                     if ($oField->getFieldType() == 'date') {
                         if (isset($_REQUEST['fields'][$oField->getFieldId()])) {
                             if (F::CheckVal($_REQUEST['fields'][$oField->getFieldId()], 'text', 6, 10) && substr_count($_REQUEST['fields'][$oField->getFieldId()], '.') == 2) {
                                 list($d, $m, $y) = explode('.', $_REQUEST['fields'][$oField->getFieldId()]);
                                 if (@checkdate($m, $d, $y)) {
                                     $sData = $_REQUEST['fields'][$oField->getFieldId()];
                                 }
                             }
                         }
                     }
                     //поле с файлом
                     if ($oField->getFieldType() == 'file') {
                         //если указано удаление файла
                         if (F::GetRequest('topic_delete_file_' . $oField->getFieldId())) {
                             if ($oTopic->getFieldFile($oField->getFieldId())) {
                                 @unlink(Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl());
                                 //$oTopic->setValueField($oField->getFieldId(),'');
                                 $sData = null;
                             }
                         } else {
                             //если удаление файла не указано, уже ранее залит файл^ и нового файла не загружалось
                             if ($sType == 'update' && isset($aValues[$oField->getFieldId()])) {
                                 $sData = $aValues[$oField->getFieldId()]->getValueSource();
                             }
                         }
                         if (isset($_FILES['fields_' . $oField->getFieldId()]) && is_uploaded_file($_FILES['fields_' . $oField->getFieldId()]['tmp_name'])) {
                             $iMaxFileSize = F::MemSize2Int(Config::Get('module.uploader.files.default.file_maxsize'));
                             $aFileExtensions = Config::Get('module.uploader.files.default.file_extensions');
                             if (!$iMaxFileSize || filesize($_FILES['fields_' . $oField->getFieldId()]['tmp_name']) <= $iMaxFileSize) {
                                 $aPathInfo = pathinfo($_FILES['fields_' . $oField->getFieldId()]['name']);
                                 if (!$aFileExtensions || in_array(strtolower($aPathInfo['extension']), $aFileExtensions)) {
                                     $sFileTmp = $_FILES['fields_' . $oField->getFieldId()]['tmp_name'];
                                     $sDirSave = Config::Get('path.uploads.root') . '/files/' . E::ModuleUser()->GetUserCurrent()->getId() . '/' . F::RandomStr(16);
                                     mkdir(Config::Get('path.root.dir') . $sDirSave, 0777, true);
                                     if (is_dir(Config::Get('path.root.dir') . $sDirSave)) {
                                         $sFile = $sDirSave . '/' . F::RandomStr(10) . '.' . strtolower($aPathInfo['extension']);
                                         $sFileFullPath = Config::Get('path.root.dir') . $sFile;
                                         if (copy($sFileTmp, $sFileFullPath)) {
                                             //удаляем старый файл
                                             if ($oTopic->getFieldFile($oField->getFieldId())) {
                                                 $sOldFile = Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl();
                                                 F::File_Delete($sOldFile);
                                             }
                                             $aFileObj = array();
                                             $aFileObj['file_hash'] = F::RandomStr(32);
                                             $aFileObj['file_name'] = E::ModuleText()->Parser($_FILES['fields_' . $oField->getFieldId()]['name']);
                                             $aFileObj['file_url'] = $sFile;
                                             $aFileObj['file_size'] = $_FILES['fields_' . $oField->getFieldId()]['size'];
                                             $aFileObj['file_extension'] = $aPathInfo['extension'];
                                             $aFileObj['file_downloads'] = 0;
                                             $sData = serialize($aFileObj);
                                             F::File_Delete($sFileTmp);
                                         }
                                     }
                                 } else {
                                     $sTypes = implode(', ', $aFileExtensions);
                                     E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_type', array('types' => $sTypes)), null, true);
                                 }
                             } else {
                                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_size', array('size' => $iMaxFileSize)), null, true);
                             }
                             F::File_Delete($_FILES['fields_' . $oField->getFieldId()]['tmp_name']);
                         }
                     }
                     // Поле с изображением
                     if ($oField->getFieldType() == 'single-image-uploader') {
                         $sTargetType = $oField->getFieldType() . '-' . $oField->getFieldId();
                         $iTargetId = $oTopic->getId();
                         // 1. Удалить значение target_tmp
                         // Нужно затереть временный ключ в ресурсах, что бы в дальнейшем картнка не
                         // воспринималась как временная.
                         if ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) {
                             // 2. Удалить куку.
                             // Если прозошло сохранение вновь созданного топика, то нужно
                             // удалить куку временной картинки. Если же сохранялся уже существующий топик,
                             // то удаление куки ни на что влиять не будет.
                             E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP);
                             // 3. Переместить фото
                             $sNewPath = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false);
                             $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, 0, E::UserId());
                             if ($aMresourceRel) {
                                 $oResource = array_shift($aMresourceRel);
                                 $sOldPath = $oResource->GetFile();
                                 $oStoredFile = E::ModuleUploader()->Store($sOldPath, $sNewPath);
                                 /** @var ModuleMresource_EntityMresource $oResource */
                                 $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid());
                                 if ($oResource) {
                                     $oResource->setUrl(E::ModuleMresource()->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $iTargetId)));
                                     $oResource->setType($sTargetType);
                                     $oResource->setUserId(E::UserId());
                                     // 4. В свойство поля записать адрес картинки
                                     $sData = $oResource->getMresourceId();
                                     $oResource = array($oResource);
                                     E::ModuleMresource()->UnlinkFile($sTargetType, 0, $oTopic->getUserId());
                                     E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $iTargetId);
                                 }
                             }
                         } else {
                             // Топик редактируется, просто обновим поле
                             $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId());
                             if ($aMresourceRel) {
                                 $oResource = array_shift($aMresourceRel);
                                 $sData = $oResource->getMresourceId();
                             } else {
                                 $sData = false;
                                 //                                    $this->DeleteField($oField);
                             }
                         }
                     }
                     E::ModuleHook()->Run('content_field_proccess', array('sData' => &$sData, 'oField' => $oField, 'oTopic' => $oTopic, 'aValues' => $aValues, 'sType' => &$sType));
                     //Добавляем поле к топику.
                     if ($sData) {
                         /** @var ModuleTopic_EntityContentValues $oValue */
                         $oValue = E::GetEntity('Topic_ContentValues');
                         $oValue->setTargetId($oTopic->getId());
                         $oValue->setTargetType('topic');
                         $oValue->setFieldId($oField->getFieldId());
                         $oValue->setFieldType($oField->getFieldType());
                         $oValue->setValue($sData);
                         $oValue->setValueSource(in_array($oField->getFieldType(), array('file', 'single-image-uploader')) ? $sData : $_REQUEST['fields'][$oField->getFieldId()]);
                         $this->AddTopicValue($oValue);
                     }
                 }
             }
         }
     }
     return true;
 }
コード例 #3
0
 public function Process()
 {
     $bResult = true;
     foreach ($this->aLinks as $nIdx => $aLinkData) {
         if (empty($aLinkData['throw']) && !empty($aLinkData['compress'])) {
             $sAssetFile = $aLinkData['asset_file'];
             $sExtension = 'min.' . F::File_GetExtension($sAssetFile);
             $sCompressedFile = F::File_SetExtension($sAssetFile, $sExtension);
             if (!$this->CheckDestination($sCompressedFile)) {
                 if ($sContents = F::File_GetContents($sAssetFile)) {
                     $sContents = $this->Compress($sContents);
                     if (F::File_PutContents($sCompressedFile, $sContents)) {
                         F::File_Delete($sAssetFile);
                         $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension);
                         if (C::Get('compress.css.gzip') && C::Get('compress.css.merge') && C::Get('compress.css.use')) {
                             // Сохраним gzip
                             $sCompressedContent = gzencode($sContents, 9);
                             F::File_PutContents($sCompressedFile . '.gz.css', $sCompressedContent);
                         }
                     }
                 }
             } else {
                 $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension);
             }
         }
     }
     return $bResult;
 }
コード例 #4
0
ファイル: ViewerAsset.class.php プロジェクト: AntiqS/altocms
 /**
  * Save cache and check-file of current asset pack
  */
 protected function _saveAssets()
 {
     $sCheckFileName = $this->GetAssetsCheckName();
     F::File_PutContents($sCheckFileName, time(), LOCK_EX, true);
     $sCacheFileName = $this->GetAssetsCacheName();
     F::File_PutContents($sCacheFileName, F::Serialize($this->aAssets), LOCK_EX, true);
     F::File_Delete($sCacheFileName . '.tmp');
 }
コード例 #5
0
 /**
  * Загружаем картинку
  */
 public function EventMultiUpload()
 {
     // Устанавливаем формат Ajax ответа
     E::ModuleViewer()->SetResponseAjax('json', FALSE);
     E::ModuleSecurity()->ValidateSendForm();
     // Проверяем, загружен ли файл
     if (!($aUploadedFile = $this->GetUploadedFile('uploader-upload-image'))) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error'));
         return false;
     }
     $sTarget = F::GetRequest('target', FALSE);
     $sTargetId = F::GetRequest('target_id', FALSE);
     $oTarget = E::ModuleUploader()->CheckAccessAndGetTarget($sTarget, $sTargetId);
     $bTmp = F::GetRequest('tmp', FALSE);
     $bTmp = $bTmp == 'true' ? true : false;
     // Проверяем, целевой объект и права на его редактирование
     if (!$oTarget) {
         // Здесь два варианта, либо редактировать нельзя, либо можно, но топика еще нет
         if ($oTarget === TRUE) {
             // Будем делать временную картинку
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('not_access'), E::ModuleLang()->Get('error'));
             return false;
         }
     }
     // Ошибок пока нет
     $sError = '';
     // Сделаем временный файд
     $sTmpFile = E::ModuleUploader()->UploadLocal($aUploadedFile);
     // Вызовем хук перед началом загрузки картинки
     E::ModuleHook()->Run('uploader_upload_before', array('oTarget' => $oTarget, 'sTmpFile' => $sTmpFile, 'sTarget' => $sTarget));
     // Если все ок, и по миме проходит, то
     if ($sTmpFile && E::ModuleImg()->MimeType($sTmpFile)) {
         // Проверим, проходит ли по количеству
         if (!E::ModuleUploader()->GetAllowedCount($sTarget = F::GetRequest('target', FALSE), $sTargetId = F::GetRequest('target_id', FALSE))) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('uploader_photoset_error_count_photos', array('MAX' => Config::Get('module.topic.photoset.count_photos_max'))), E::ModuleLang()->Get('error'));
             return FALSE;
         }
         // Определим, существует ли объект или он будет создан позже
         if (!($sTmpKey = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && $sTargetId == '0' && $bTmp) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error'));
             return FALSE;
         }
         // Пересохраним файл из кэша
         // Сохраняем фото во временный файл
         $oImg = E::ModuleImg()->Read($sTmpFile);
         $sExtension = strtolower(pathinfo($sTmpFile, PATHINFO_EXTENSION));
         if (!($sTmpFile = $oImg->Save(F::File_UploadUniqname($sExtension)))) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('error_upload_image'), E::ModuleLang()->Get('error'));
             return FALSE;
         }
         // Окончательная запись файла только через модуль Uploader
         if ($oStoredFile = E::ModuleUploader()->StoreImage($sTmpFile, $sTarget, $sTargetId, null, true)) {
             /** @var ModuleMresource_EntityMresource $oResource */
             //$oResource = $this->AddUploadedFileRelationInfo($oStoredFile, $sTarget, $sTargetId, TRUE);
             $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid());
             $sFile = $oStoredFile->GetUrl();
             if ($oResource) {
                 $oResource->setType(ModuleMresource::TYPE_PHOTO);
                 E::ModuleMresource()->UpdateType($oResource);
             }
             $sFilePreview = $sFile;
             if ($sSize = F::GetRequest('crop_size', FALSE)) {
                 $sFilePreview = E::ModuleUploader()->ResizeTargetImage($sFile, $sSize);
             }
             // Запускаем хук на действия после загрузки картинки
             E::ModuleHook()->Run('uploader_upload_image_after', array('sFile' => $sFile, 'sFilePreview' => $sFilePreview, 'sTargetId' => $sTargetId, 'sTarget' => $sTarget, 'oTarget' => $oTarget));
             E::ModuleViewer()->AssignAjax('file', $sFilePreview);
             E::ModuleViewer()->AssignAjax('id', $oResource->getMresourceId());
             // Чистим
             E::ModuleImg()->Delete($sTmpFile);
             return TRUE;
         }
     } else {
         // Ошибки загрузки картинки
         $sError = E::ModuleUploader()->GetErrorMsg();
         if (!$sError) {
             $sError = E::ModuleLang()->Get('error_upload_image');
         }
     }
     // Выведем ошибки пользователю
     E::ModuleMessage()->AddError($sError, E::ModuleLang()->Get('error'));
     // Удалим ранее загруженый файл
     F::File_Delete($sTmpFile);
 }
コード例 #6
0
ファイル: ActionAdmin.class.php プロジェクト: ZeoNish/altocms
 protected function _eventLogsErrorDelete($sLogFile)
 {
     F::File_Delete($sLogFile);
 }
コード例 #7
0
ファイル: Mresource.class.php プロジェクト: hard990/altocms
 /**
  * Deletes media resources by ID
  *
  * @param $aMresources
  * @param $bDeleteFiles
  * @param $bNoCheckTargets
  *
  * @return bool
  */
 public function DeleteMresources($aMresources, $bDeleteFiles = true, $bNoCheckTargets = false)
 {
     $aId = $this->_entitiesId($aMresources);
     $bResult = true;
     if ($aId) {
         if ($bDeleteFiles) {
             $aMresources = $this->oMapper->GetMresourcesById($aId);
             if (!$bNoCheckTargets && $aMresources) {
                 /** @var ModuleMresource_EntityMresource $oMresource */
                 foreach ($aMresources as $oMresource) {
                     // Если число ссылок > 0, то не удаляем
                     if ($oMresource->getTargetsCount() > 0) {
                         $iIdx = array_search($oMresource->getId(), $aId);
                         if ($iIdx !== false) {
                             unset($aId[$iIdx]);
                         }
                     }
                 }
             }
         }
         $bResult = $this->oMapper->DeleteMresources($aId);
         if ($bDeleteFiles) {
             if ($bResult && $aMresources && $aId) {
                 // Удаляем файлы
                 foreach ($aId as $nId) {
                     if (isset($aMresources[$nId]) && $aMresources[$nId]->IsFile() && $aMresources[$nId]->CanDelete()) {
                         if ($aMresources[$nId]->IsImage()) {
                             E::ModuleImg()->Delete($aMresources[$nId]->GetFile());
                         } else {
                             F::File_Delete($aMresources[$nId]->GetFile());
                         }
                     }
                 }
             }
         }
     }
     E::ModuleCache()->CleanByTags(array('mresource_update', 'mresource_rel_update'));
     return $bResult;
 }
コード例 #8
0
ファイル: Uploader.class.php プロジェクト: AntiqS/altocms
 /**
  * Upload file from client via HTTP POST
  *
  * @param array  $aFile
  * @param string $sTarget
  * @param string $sDir
  * @param bool   $bOriginalName
  *
  * @return bool|string
  */
 public function UploadLocal($aFile, $sTarget = 'default', $sDir = null, $bOriginalName = false)
 {
     $this->nLastError = 0;
     if (is_array($aFile) && isset($aFile['tmp_name']) && isset($aFile['name'])) {
         if ($aFile['error'] === UPLOAD_ERR_OK) {
             if (is_uploaded_file($aFile['tmp_name'])) {
                 if ($bOriginalName) {
                     $sTmpFile = F::File_GetUploadDir() . $aFile['name'];
                 } else {
                     if (E::UserId()) {
                         $sExtension = dechex(E::UserId()) . '.' . pathinfo($aFile['name'], PATHINFO_EXTENSION);
                     } else {
                         $sExtension = pathinfo($aFile['name'], PATHINFO_EXTENSION);
                     }
                     $sTmpFile = strtolower(basename(F::File_UploadUniqname($sExtension)));
                 }
                 // Copy uploaded file in our temp folder
                 if ($sTmpFile = F::File_MoveUploadedFile($aFile['tmp_name'], $sTmpFile)) {
                     if ($this->_checkUploadedFile($sTmpFile, $sTarget)) {
                         if ($sDir) {
                             $sTmpFile = $this->MoveTmpFile($sTmpFile, $sDir);
                         }
                         return $sTmpFile;
                     } else {
                         F::File_Delete($sTmpFile);
                     }
                 }
             } else {
                 // Файл не был загружен при помощи HTTP POST
                 $this->nLastError = self::ERR_NOT_POST_UPLOADED;
             }
         } else {
             // Ошибка загузки файла
             $this->nLastError = $aFile['error'];
         }
     } else {
         $this->nLastError = self::ERR_NOT_FILE_VARIABLE;
     }
     return false;
 }
コード例 #9
0
ファイル: Config.class.php プロジェクト: ZeoNish/altocms
 /**
  * Удаляет кеш-файл кастомной конфигуации
  *
  */
 protected static function _deleteCustomCfg()
 {
     $sFile = self::_checkCustomCfg(true);
     if ($sFile) {
         F::File_Delete($sFile);
     }
 }
コード例 #10
0
ファイル: ViewerAsset.class.php プロジェクト: AlexSSN/altocms
 /**
  * Save cache and check-file of current asset pack
  */
 protected function _saveAssets()
 {
     F::File_PutContents($this->GetAssetsCheckName(), time());
     $sFile = $this->GetAssetsCacheName();
     F::File_PutContents($sFile, F::Serialize($this->aAssets));
     F::File_Delete($sFile . '.tmp');
 }
コード例 #11
0
ファイル: Img.class.php プロジェクト: hard990/altocms
 /**
  * Delete image file and its duplicates
  *
  * @param string $sFile
  *
  * @return bool
  */
 public function Delete($sFile)
 {
     return F::File_Delete($sFile) && $this->DeleteDuplicates($sFile);
 }
コード例 #12
0
 /**
  * @param int  $nStage
  * @param bool $bFinal
  */
 protected function _stageEnd($nStage, $bFinal = false)
 {
     $sFile = F::File_GetAssetDir() . '_check/' . $this->GetHash();
     F::File_PutContents($sFile . '.' . $nStage . '.end.tmp', time());
     for ($n = 1; $n <= $nStage; $n++) {
         F::File_Delete($sFile . '.' . $n . '.begin.tmp');
         if ($n < $nStage || $bFinal) {
             F::File_Delete($sFile . '.' . $n . '.end.tmp');
         }
     }
 }
コード例 #13
0
 /**
  * Загрузка временной картинки фото для последущего ресайза
  */
 protected function EventUploadPhoto()
 {
     if (isset($_FILES['foto']) && !isset($_FILES['photo'])) {
         $_FILES['photo'] = $_FILES['foto'];
     }
     // * Устанавливаем формат Ajax ответа
     $this->Viewer_SetResponseAjax(F::AjaxRequest(true) ? 'json' : 'jsonIframe', false);
     if (!($aUploadedFile = $this->GetUploadedFile('photo')) && !($aUploadedFile = $this->GetUploadedFile('foto'))) {
         $this->Message_AddError($this->Lang_Get('settings_profile_photo_error'), $this->Lang_Get('error'));
         return;
     }
     $sError = '';
     $sTmpFile = $this->Uploader_UploadLocal($aUploadedFile);
     if ($sTmpFile && $this->Img_MimeType($sTmpFile)) {
         /**
          * Ресайзим и сохраняем уменьшенную копию
          * Храним две копии - мелкую для показа пользователю и крупную в качестве исходной для ресайза
          */
         $sPreviewFile = $this->Uploader_GetUserAvatarDir($this->oUserCurrent->getId()) . 'photo-preview.' . F::File_GetExtension($sTmpFile, true);
         if ($sPreviewFile = $this->Img_Copy($sTmpFile, $sPreviewFile, self::PREVIEW_RESIZE, self::PREVIEW_RESIZE)) {
             // * Сохраняем в сессии временный файл с изображением
             $this->Session_Set('sPhotoTmp', $sTmpFile);
             $this->Session_Set('sPhotoPreview', $sPreviewFile);
             $this->Viewer_AssignAjax('sTmpFile', $this->Uploader_Dir2Url($sPreviewFile));
             return;
         }
     } else {
         $sError = $this->Uploader_GetErrorMsg();
         if (!$sError) {
             $sError = $this->Lang_Get('settings_profile_photo_error');
         }
     }
     $this->Message_AddError($sError, $this->Lang_Get('error'));
     F::File_Delete($sTmpFile);
 }
コード例 #14
0
ファイル: Log.entity.class.php プロジェクト: ZeoNish/altocms
 /**
  * Переименовывает все файлы логов согласно их последовательности
  *
  * @param string $sFileName
  * @param int    $iNumberLast
  */
 protected function _rotateRename($sFileName, $iNumberLast)
 {
     $aPathInfo = pathinfo($sFileName);
     $iMaxCount = $this->GetCountForRotate();
     $sPathFile = $aPathInfo['dirname'] . '/' . $aPathInfo['filename'];
     for ($i = $iNumberLast; $i > 0; $i--) {
         $sFullNameCur = $sPathFile . ".{$i}." . $aPathInfo['extension'];
         if ($iMaxCount && $iMaxCount <= $i) {
             F::File_Delete($sFullNameCur);
         } else {
             $sFullNameNew = $sPathFile . '.' . ($i + 1) . '.' . $aPathInfo['extension'];
             rename($sFullNameCur, $sFullNameNew);
         }
     }
     rename($sFileName, $sPathFile . '.1.' . $aPathInfo['extension']);
 }