Пример #1
0
/**
 * Crée un sous répertoire
 *
 * Retourne `$base/${subdir}/` si le sous-repertoire peut être crée,
 * `$base/${subdir}_` sinon.
 *
 * @example
 *     ```
 *     sous_repertoire(_DIR_CACHE, 'demo');
 *     sous_repertoire(_DIR_CACHE . '/demo');
 *     ```
 *
 * @param string $base
 *     - Chemin du répertoire parent (avec $subdir)
 *     - sinon chemin du répertoire à créer
 * @param string $subdir
 *     - Nom du sous répertoire à créer,
 *     - non transmis, `$subdir` vaut alors ce qui suit le dernier `/` dans `$base`
 * @param bool $nobase
 *     true pour ne pas avoir le chemin du parent `$base/` dans le retour
 * @param bool $tantpis
 *     true pour ne pas raler en cas de non création du répertoire
 * @return string
 *     Chemin du répertoire créé.
 **/
function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false)
{
    static $dirs = array();
    $base = str_replace("//", "/", $base);
    # suppr le dernier caractere si c'est un / ou un _
    $base = rtrim($base, '/_');
    if (!strlen($subdir)) {
        $n = strrpos($base, "/");
        if ($n === false) {
            return $nobase ? '' : $base . '/';
        }
        $subdir = substr($base, $n + 1);
        $base = substr($base, 0, $n + 1);
    } else {
        $base .= '/';
        $subdir = str_replace("/", "", $subdir);
    }
    $baseaff = $nobase ? '' : $base;
    if (isset($dirs[$base . $subdir])) {
        return $baseaff . $dirs[$base . $subdir];
    }
    if (_CREER_DIR_PLAT and @file_exists("{$base}{$subdir}.plat")) {
        return $baseaff . ($dirs[$base . $subdir] = "{$subdir}_");
    }
    $path = $base . $subdir;
    # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'
    if (file_exists("{$path}/.ok")) {
        return $baseaff . ($dirs[$base . $subdir] = "{$subdir}/");
    }
    @mkdir($path, _SPIP_CHMOD);
    @chmod($path, _SPIP_CHMOD);
    if (is_dir($path) && is_writable($path)) {
        @touch("{$path}/.ok");
        spip_log("creation {$base}{$subdir}/");
        return $baseaff . ($dirs[$base . $subdir] = "{$subdir}/");
    }
    // en cas d'echec c'est peut etre tout simplement que le disque est plein :
    // l'inode du fichier dir_test existe, mais impossible d'y mettre du contenu
    // => sauf besoin express (define dans mes_options), ne pas creer le .plat
    if (_CREER_DIR_PLAT and $f = @fopen("{$base}{$subdir}.plat", "w")) {
        fclose($f);
    } else {
        spip_log("echec creation {$base}{$subdir}");
        if ($tantpis) {
            return '';
        }
        if (!_DIR_RESTREINT) {
            $base = preg_replace(',^' . _DIR_RACINE . ',', '', $base);
        }
        $base .= $subdir;
        raler_fichier($base . '/.plat');
    }
    spip_log("faux sous-repertoire {$base}{$subdir}");
    return $baseaff . ($dirs[$base . $subdir] = "{$subdir}_");
}
Пример #2
0
/**
 * Déplacer ou copier un fichier
 *
 * @uses _DIR_RACINE
 * @uses spip_unlink()
 *
 * @param string $source
 *     Fichier source à copier
 * @param string $dest
 *     Fichier de destination
 * @param bool $move
 *     - `true` : on déplace le fichier source vers le fichier de destination
 *     - `false` : valeur par défaut. On ne fait que copier le fichier source vers la destination.
 * @return bool|mixed|string
 */
function deplacer_fichier_upload($source, $dest, $move = false)
{
    // Securite
    if (substr($dest, 0, strlen(_DIR_RACINE)) == _DIR_RACINE) {
        $dest = _DIR_RACINE . preg_replace(',\\.\\.+,', '.', substr($dest, strlen(_DIR_RACINE)));
    } else {
        $dest = preg_replace(',\\.\\.+,', '.', $dest);
    }
    if ($move) {
        $ok = @rename($source, $dest);
    } else {
        $ok = @copy($source, $dest);
    }
    if (!$ok) {
        $ok = @move_uploaded_file($source, $dest);
    }
    if ($ok) {
        @chmod($dest, _SPIP_CHMOD & ~0111);
    } else {
        $f = @fopen($dest, 'w');
        if ($f) {
            fclose($f);
        } else {
            include_spip('inc/flock');
            raler_fichier($dest);
        }
        spip_unlink($dest);
    }
    return $ok ? $dest : false;
}
Пример #3
0
function sous_repertoire($base, $subdir='', $nobase = false, $tantpis=false) {
	static $dirs = array();

	$base = str_replace("//", "/", $base);

	# suppr le dernier caractere si c'est un / ou un _
	$base = rtrim($base, '/_');

	if (!strlen($subdir)) {
		$n = strrpos($base, "/");
		if ($n === false) return $nobase ? '' : ($base .'/');
		$subdir = substr($base, $n+1);
		$base = substr($base, 0, $n+1);
	} else {
		$base .= '/';
		$subdir = str_replace("/", "", $subdir);
	}

	$baseaff = $nobase ? '' : $base;
	if (isset($dirs[$base.$subdir]))
		return $baseaff.$dirs[$base.$subdir];


	if (_CREER_DIR_PLAT AND @file_exists("$base${subdir}.plat"))
		return $baseaff.($dirs[$base.$subdir] = "${subdir}_");

	$path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'

	if (file_exists("$path/.ok"))
		return $baseaff.($dirs[$base.$subdir] = "$subdir/");

	@mkdir($path, _SPIP_CHMOD);
	@chmod($path, _SPIP_CHMOD);

	$ok = false;
	if ($test = @fopen("$path/dir_test.php", "w")) {
		@fputs($test, '<'.'?php $ok = true; ?'.'>');
		@fclose($test);
		@include("$path/dir_test.php");
		spip_unlink("$path/dir_test.php");
	}
	if ($ok) {
		@touch ("$path/.ok");
		spip_log("creation $base$subdir/");
		return $baseaff.($dirs[$base.$subdir] = "$subdir/");
	}

	// en cas d'echec c'est peut etre tout simplement que le disque est plein :
	// l'inode du fichier dir_test existe, mais impossible d'y mettre du contenu
	// => sauf besoin express (define dans mes_options), ne pas creer le .plat
	if (_CREER_DIR_PLAT
	AND $f = @fopen("$base${subdir}.plat", "w"))
		fclose($f);
	else {
		spip_log("echec creation $base${subdir}");
		if ($tantpis) return '';
		if (!_DIR_RESTREINT)
			$base = preg_replace(',^' . _DIR_RACINE .',', '',$base);
		if ($test) $base .= $subdir;
		raler_fichier($base . '/.ok');
	}
	spip_log("faux sous-repertoire $base${subdir}");
	return $baseaff.($dirs[$base.$subdirs] = "${subdir}_");
}