Back to Folder class

Method create

public static bool
create
(mixed $path = '', mixed $mode = 0755)
Create a folder -- and all necessary parent folders.
Parameters
  • string $path A path to create from the base path.
  • int $mode Directory permissions to set for folders created. 0755 by default.
Returns
  • bool True if successful.
Since
  • 1.7.0
Class: Folder
Project: Joomla

Method create - Source code

/**
 * Create a folder -- and all necessary parent folders.
 *
 * @param   string   $path  A path to create from the base path.
 * @param   integer  $mode  Directory permissions to set for folders created. 0755 by default.
 *
 * @return  boolean  True if successful.
 *
 * @since   1.7.0
 */
public static function create($path = '', $mode = 0755)
{
    $FTPOptions = ClientHelper::getCredentials('ftp');
    static $nested = 0;
    // Check to make sure the path valid and clean
    $path = Path::clean($path);
    // Check if parent dir exists
    $parent = \dirname($path);
    if (!self::exists($parent)) {
        // Prevent infinite loops!
        $nested++;
        if ($nested > 20 || $parent == $path) {
            Log::add(__METHOD__ . ': ' . Text::_('JLIB_FILESYSTEM_ERROR_FOLDER_LOOP'), Log::WARNING, 'jerror');
            $nested--;
            return false;
        }
        // Create the parent directory
        if (self::create($parent, $mode) !== true) {
            // Folder::create throws an error
            $nested--;
            return false;
        }
        // OK, parent directory has been created
        $nested--;
    }
    // Check if dir already exists
    if (self::exists($path)) {
        return true;
    }
    // Check for safe mode
    if ($FTPOptions['enabled'] == 1) {
        // Connect the FTP client
        $ftp = FtpClient::getInstance($FTPOptions['host'], $FTPOptions['port'], array(), $FTPOptions['user'], $FTPOptions['pass']);
        // Translate path to FTP path
        $path = Path::clean(str_replace(JPATH_ROOT, $FTPOptions['root'], $path), '/');
        $ret = $ftp->mkdir($path);
        $ftp->chmod($path, $mode);
    } else {
        // We need to get and explode the open_basedir paths
        $obd = ini_get('open_basedir');
        // If open_basedir is set we need to get the open_basedir that the path is in
        if ($obd != null) {
            if (IS_WIN) {
                $obdSeparator = ';';
            } else {
                $obdSeparator = ':';
            }
            // Create the array of open_basedir paths
            $obdArray = explode($obdSeparator, $obd);
            $inBaseDir = false;
            // Iterate through open_basedir paths looking for a match
            foreach ($obdArray as $test) {
                $test = Path::clean($test);
                if (strpos($path, $test) === 0 || strpos($path, realpath($test)) === 0) {
                    $inBaseDir = true;
                    break;
                }
            }
            if ($inBaseDir == false) {
                // Return false for JFolder::create because the path to be created is not in open_basedir
                Log::add(__METHOD__ . ': ' . Text::_('JLIB_FILESYSTEM_ERROR_FOLDER_PATH'), Log::WARNING, 'jerror');
                return false;
            }
        }
        // First set umask
        $origmask = @umask(0);
        // Create the path
        if (!($ret = @mkdir($path, $mode))) {
            @umask($origmask);
            Log::add(__METHOD__ . ': ' . Text::_('JLIB_FILESYSTEM_ERROR_COULD_NOT_CREATE_DIRECTORY') . 'Path: ' . $path, Log::WARNING, 'jerror');
            return false;
        }
        // Reset umask
        @umask($origmask);
    }
    return $ret;
}