/administrator/components/com_akeeba/akeeba/utils/filesystem.php
PHP | 218 lines | 174 code | 12 blank | 32 comment | 16 complexity | e179dea0f15f91657a0b69cd0b24d118 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-2.0, MIT, BSD-3-Clause, LGPL-2.1
- <?php
- /**
- * Akeeba Engine
- * The modular PHP5 site backup engine
- * @copyright Copyright (c)2009-2012 Nicholas K. Dionysopoulos
- * @license GNU GPL version 3 or, at your option, any later version
- * @package akeebaengine
- * @version $Id$
- */
- // Protection against direct access
- defined('AKEEBAENGINE') or die('Restricted access');
- /**
- * Utility functions related to filesystem objects, e.g. path translation
- */
- class AEUtilFilesystem
- {
- /**
- * Makes a Windows path more UNIX-like, by turning backslashes to forward slashes.
- * It takes into account UNC paths, e.g. \\myserver\some\folder becomes
- * \\myserver/some/folder
- *
- * @param string $p_path The path to transform
- * @return string
- */
- static public function TranslateWinPath( $p_path )
- {
- static $is_windows;
- if(empty($is_windows))
- {
- $is_windows = (DIRECTORY_SEPARATOR == '\\');
- }
- $is_unc = false;
- if ($is_windows)
- {
- // Is this a UNC path?
- $is_unc = (substr($p_path, 0, 2) == '\\\\') || (substr($p_path, 0, 2) == '//');
- // Change potential windows directory separator
- if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')){
- $p_path = strtr($p_path, '\\', '/');
- }
- }
- // Remove multiple slashes
- $p_path = str_replace('///','/',$p_path);
- $p_path = str_replace('//','/',$p_path);
- // Fix UNC paths
- if($is_unc)
- {
- $p_path = '//'.ltrim($p_path,'/');
- }
- return $p_path;
- }
- /**
- * Removes trailing slash or backslash from a pathname
- *
- * @param string $path The path to treat
- * @return string The path without the trailing slash/backslash
- */
- static public function TrimTrailingSlash($path)
- {
- $newpath = $path;
- if( substr($path, strlen($path)-1, 1) == '\\' )
- {
- $newpath = substr($path, 0, strlen($path)-1);
- }
- if( substr($path, strlen($path)-1, 1) == '/' )
- {
- $newpath = substr($path, 0, strlen($path)-1);
- }
- return $newpath;
- }
- public static function get_archive_name_variables()
- {
- $variables = null;
- $registry = AEFactory::getConfiguration();
- $serialized = $registry->get('volatile.core.archivenamevars', null);
- if(!empty($serialized)) {
- $variables = @unserialize($serialized);
- }
- if(empty($variables))
- {
- $host = AEPlatform::getInstance()->get_host();
- $version = defined('AKEEBA_VERSION') ? AKEEBA_VERSION : 'svn';
- $variables = array(
- '[DATE]' => AEPlatform::getInstance()->get_local_timestamp("%Y%m%d"),
- '[YEAR]' => AEPlatform::getInstance()->get_local_timestamp("%Y"),
- '[MONTH]' => AEPlatform::getInstance()->get_local_timestamp("%m"),
- '[DAY]' => AEPlatform::getInstance()->get_local_timestamp("%d"),
- '[TIME]' => AEPlatform::getInstance()->get_local_timestamp("%H%M%S"),
- '[WEEK]' => AEPlatform::getInstance()->get_local_timestamp("%U"),
- '[WEEKDAY]' => AEPlatform::getInstance()->get_local_timestamp("%A"),
- '[HOST]' => empty($host) ? 'unknown_host' : $host,
- '[RANDOM]' => md5(microtime()),
- '[VERSION]' => $version
- );
- }
- return $variables;
- }
- public static function replace_archive_name_variables($source)
- {
- $tagReplacements = self::get_archive_name_variables();
- return str_replace( array_keys($tagReplacements), array_values($tagReplacements), $source );
- }
- /**
- * Returns the relative and absolute path to the archive, if defined
- * @param string $relative The relative path
- * @param string $absolute The absolute path
- */
- public static function get_archive_name( &$relative, &$absolute )
- {
- static $relative_path = null;
- static $absolute_path = null;
- if( is_null($relative_path) || is_null($absolute_path) )
- {
- $registry = AEFactory::getConfiguration();
- // Import volatile scripting keys to the registry
- AEUtilScripting::importScriptingToRegistry();
- // Determine the extension
- $force_extension = AEUtilScripting::getScriptingParameter('core.forceextension', null);
- if( is_null($force_extension) )
- {
- $archiver = AEFactory::getArchiverEngine();
- $extension = $archiver->getExtension();
- }
- else
- {
- $extension = $force_extension;
- }
- // Get the template name
- $templateName = $registry->get('akeeba.basic.archive_name');
- AEUtilLogger::WriteLog(_AE_LOG_DEBUG, "Archive template name: $templateName");
- // Parse all tags
- $templateName = self::replace_archive_name_variables($templateName);
- AEUtilLogger::WriteLog(_AE_LOG_DEBUG, "Expanded template name: $templateName");
- $ds = DIRECTORY_SEPARATOR;
- $relative_path = $templateName.$extension;
- $absolute_path = AEUtilFilesystem::TranslateWinPath( $registry->get('akeeba.basic.output_directory').$ds.$relative_path );
- }
- $relative = $relative_path;
- $absolute = $absolute_path;
- }
- /**
- * Checks if a folder (directory) exists.
- * @param string $folder_to_check The path to check if it exists
- * @return bool True if the folder is there, false if it's not or the path exists but is not a folder
- */
- static function folderExists($folder_to_check)
- {
- // Try to find the real path to the folder
- $folder_clean = @realpath($folder_to_check);
- if( ($folder_clean !== false) && (!empty($folder_clean)) )
- {
- $folder = $folder_clean;
- }
- else
- {
- $folder = $folder_to_check;
- }
- // Clear filesystem cache to avoid getting stale information
- if(function_exists("clearstatcache")) clearstatcache();
- // Check that the path is there
- if( !file_exists($folder) ) return false;
- // Check that it is a folder, indeed
- if( !is_dir($folder) ) return false;
- return true;
- }
- static function translateStockDirs( $folder, $translate_win_dirs = false, $trim_trailing_slash = false )
- {
- static $stock_dirs;
- if(empty($stock_dirs))
- {
- $stock_dirs = AEPlatform::getInstance()->get_stock_directories();
- }
- $temp = $folder;
- foreach($stock_dirs as $find => $replace)
- {
- $temp = str_replace($find, $replace, $temp);
- }
- if($translate_win_dirs)
- {
- $temp = self::TranslateWinPath( $temp );
- }
- if( $trim_trailing_slash )
- {
- $temp = self::TrimTrailingSlash( $temp );
- }
- return $temp;
- }
- }