/** * 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}_"); }
/** * 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; }
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}_"); }