Вход Регистрация
Файл: contao-3.5.8/system/modules/core/library/Contao/Files.php
Строк: 234
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * A wrapper class for accessing the file system
 *
 * The class handles file operations, either directly via the PHP functions or
 * through an FTP connection. The latter is a workaround for insufficient file
 * permissions when the PHP process runs under a different user than the file
 * owner (referred to as "Safe Mode Hack").
 *
 * Usage:
 *
 *     $files = Files::getInstance();
 *
 *     $files->mkdir('test');
 *
 *     $files->fopen('test/one.txt', 'wb');
 *     $files->fputs('My test');
 *     $files->fclose();
 *
 *     $files->rrdir('test');
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
abstract class Files
{

    
/**
     * Object instance (Singleton)
     * @var Files
     */
    
protected static $objInstance;


    
/**
     * Prevent direct instantiation (Singleton)
     */
    
protected function __construct() {}


    
/**
     * Prevent cloning of the object (Singleton)
     */
    
final public function __clone() {}


    
/**
     * Instantiate the object (Factory)
     *
     * @return Files The files object
     */
    
public static function getInstance()
    {
        if (
self::$objInstance === null)
        {
            
// Use FTP to modify files
            
if (Config::get('useFTP'))
            {
                
self::$objInstance = new FilesFtp();
            }

            
// HOOK: use the smhextended module
            
elseif (Config::get('useSmhExtended') && in_array('smhextended'ModuleLoader::getActive()))
            {
                
self::$objInstance = new SMHExtended();
            }

            
// Use PHP to modify files
            
else
            {
                
self::$objInstance = new FilesPhp();
            }
        }

        return 
self::$objInstance;
    }


    
/**
     * Create a directory
     *
     * @param string $strDirectory The directory name
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function mkdir($strDirectory);


    
/**
     * Remove a directory
     *
     * @param string $strDirectory The directory name
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function rmdir($strDirectory);


    
/**
     * Recursively remove a directory
     *
     * @param string  $strFolder       The directory name
     * @param boolean $blnPreserveRoot If true, the root folder will not be removed
     */
    
public function rrdir($strFolder$blnPreserveRoot=false)
    {
        
$this->validate($strFolder);
        
$arrFiles scan(TL_ROOT '/' $strFoldertrue);

        foreach (
$arrFiles as $strFile)
        {
            if (
is_dir(TL_ROOT '/' $strFolder '/' $strFile))
            {
                
$this->rrdir($strFolder '/' $strFile);
            }
            else
            {
                
$this->delete($strFolder '/' $strFile);
            }
        }

        if (!
$blnPreserveRoot)
        {
            
$this->rmdir($strFolder);
        }
    }


    
/**
     * Open a file and return the handle
     *
     * @param string $strFile The file name
     * @param string $strMode The operation mode
     *
     * @return resource The file handle
     */
    
abstract public function fopen($strFile$strMode);


    
/**
     * Write content to a file
     *
     * @param resource $resFile    The file handle
     * @param string   $strContent The content to store in the file
     */
    
abstract public function fputs($resFile$strContent);


    
/**
     * Close a file handle
     *
     * @param resource $resFile The file handle
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function fclose($resFile);


    
/**
     * Rename a file or folder
     *
     * @param string $strOldName The old name
     * @param string $strNewName The new name
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function rename($strOldName$strNewName);


    
/**
     * Copy a file or folder
     *
     * @param string $strSource      The source file or folder
     * @param string $strDestination The new file or folder path
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function copy($strSource$strDestination);


    
/**
     * Recursively copy a directory
     *
     * @param string $strSource      The source file or folder
     * @param string $strDestination The new file or folder path
     */
    
public function rcopy($strSource$strDestination)
    {
        
$this->validate($strSource$strDestination);

        
$this->mkdir($strDestination);
        
$arrFiles scan(TL_ROOT '/' $strSourcetrue);

        foreach (
$arrFiles as $strFile)
        {
            if (
is_dir(TL_ROOT '/' $strSource '/' $strFile))
            {
                
$this->rcopy($strSource '/' $strFile$strDestination '/' $strFile);
            }
            else
            {
                
$this->copy($strSource '/' $strFile$strDestination '/' $strFile);
            }
        }
    }


    
/**
     * Delete a file
     *
     * @param string $strFile The file name
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function delete($strFile);


    
/**
     * Change the file mode
     *
     * @param string $strFile The file name
     * @param mixed  $varMode The new file mode
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function chmod($strFile$varMode);


    
/**
     * Check whether a file is writeable
     *
     * @param string $strFile The file name
     *
     * @return boolean True if the file is writeable
     */
    
abstract public function is_writeable($strFile);


    
/**
     * Move an uploaded file to a folder
     *
     * @param string $strSource      The source file
     * @param string $strDestination The new file path
     *
     * @return boolean True if the operation was successful
     */
    
abstract public function move_uploaded_file($strSource$strDestination);


    
/**
     * Validate a path
     *
     * @throws RuntimeException If the given paths are not valid
     */
    
protected function validate()
    {
        foreach (
func_get_args() as $strPath)
        {
            if (
$strPath == ''// see #5795
            
{
                throw new 
RuntimeException('No file or folder name given');
            }
            elseif (
Validator::isInsecurePath($strPath))
            {
                throw new 
RuntimeException('Invalid file or folder name ' $strPath);
            }
        }
    }
}
Онлайн: 1
Реклама