New file |
0,0 → 1,328 |
<?php |
# ***** BEGIN LICENSE BLOCK ***** |
# This file is part of DotClear. |
# Copyright (c) 2004 Olivier Meunier and contributors. All rights |
# reserved. |
# |
# DotClear is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2 of the License, or |
# (at your option) any later version. |
# |
# DotClear is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with DotClear; if not, write to the Free Software |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# |
# ***** END LICENSE BLOCK ***** |
|
class files |
{ |
function scandir($d,$order=0) |
{ |
$res = array(); |
if (($dh = @opendir($d)) !== false) |
{ |
while (($f = readdir($dh)) !== false) { |
$res[] = $f; |
} |
closedir($dh); |
|
sort($res); |
if ($order == 1) { |
rsort($res); |
} |
|
return $res; |
} |
else |
{ |
return false; |
} |
} |
|
function isDeletable($f) |
{ |
if (is_file($f)) { |
return is_writable(dirname($f)); |
} elseif (is_dir($f)) { |
return (is_writable(dirname($f)) && count(files::scandir($f)) <= 2); |
} |
} |
|
# Suppression récursive d'un répertoire (rm -rf) |
function deltree($dir) |
{ |
$current_dir = opendir($dir); |
while($entryname = readdir($current_dir)) |
{ |
if (is_dir($dir.'/'.$entryname) and ($entryname != '.' and $entryname!='..')) |
{ |
if (!files::deltree($dir.'/'.$entryname)) { |
return false; |
} |
} |
elseif ($entryname != '.' and $entryname!='..') |
{ |
if (!@unlink($dir.'/'.$entryname)) { |
return false; |
} |
} |
} |
closedir($current_dir); |
return @rmdir($dir); |
} |
|
function touch($f) |
{ |
if (is_writable($f)) { |
$c = implode('',file($f)); |
if ($fp = @fopen($f,'w')) { |
fwrite($fp,$c,strlen($c)); |
fclose($fp); |
} |
} |
} |
|
function secureFile($f) |
{ |
if (is_file($f)) |
{ |
@chmod($f,0600); |
if (is_readable($f)) { |
return true; |
} else { |
@chmod($f,0660); |
if (is_readable($f)) { |
return true; |
} else { |
@chmod($f,0666); |
} |
} |
} |
} |
|
function makeDir($f) |
{ |
if (@mkdir($f,fileperms(dirname($f))) === false) { |
return false; |
} |
|
@chmod($f,fileperms(dirname($f))); |
} |
|
function putContent($f, $f_content) |
{ |
if (is_writable($f)) |
{ |
if ($fp = @fopen($f, 'w')) |
{ |
fwrite($fp,$f_content,strlen($f_content)); |
fclose($fp); |
return true; |
} |
} |
|
return false; |
} |
|
function size($size) |
{ |
$kb = 1024; |
$mb = 1024 * $kb; |
$gb = 1024 * $mb; |
$tb = 1024 * $gb; |
|
if($size < $kb) { |
return $size." B"; |
} |
else if($size < $mb) { |
return round($size/$kb,2)." KB"; |
} |
else if($size < $gb) { |
return round($size/$mb,2)." MB"; |
} |
else if($size < $tb) { |
return round($size/$gb,2)." GB"; |
} |
else { |
return round($size/$tb,2)." TB"; |
} |
} |
|
# Copier d'un fichier binaire distant |
function copyRemote($src,$dest) |
{ |
if (($fp1 = @fopen($src,'r')) === false) |
{ |
return __('An error occured while downloading the file.'); |
} |
else |
{ |
if (($fp2 = @fopen($dest,'w')) === false) |
{ |
fclose($fp1); |
return __('An error occured while writing the file.'); |
} |
else |
{ |
while (($buffer = fgetc($fp1)) !== false) { |
fwrite($fp2,$buffer); |
} |
fclose($fp1); |
fclose($fp2); |
return true; |
} |
} |
} |
|
|
# Fonctions de création de packages |
# |
function getDirList($dirName) |
{ |
static $filelist = array(); |
static $dirlist = array(); |
|
$exclude_list=array('.','..','.svn'); |
|
if (empty($res)) { |
$res = array(); |
} |
|
$dirName = preg_replace('|/$|','',$dirName); |
|
if (!is_dir($dirName)) { |
return false; |
} |
|
$dirlist[] = $dirName; |
|
$d = dir($dirName); |
while($entry = $d->read()) |
{ |
if (!in_array($entry,$exclude_list)) |
{ |
if (is_dir($dirName.'/'.$entry)) |
{ |
if ($entry != 'CVS') |
{ |
files::getDirList($dirName.'/'.$entry); |
} |
} |
else |
{ |
$filelist[] = $dirName.'/'.$entry; |
} |
} |
} |
$d->close(); |
|
return array('dirs'=>$dirlist, 'files'=>$filelist); |
} |
|
function makePackage($name,$dir,$remove_path='',$gzip=true) |
{ |
if ($gzip && !function_exists('gzcompress')) { |
return false; |
} |
|
if (($filelist = files::getDirList($dir)) === false) { |
return false; |
} |
|
$res = array ('name' => $name, 'dirs' => array(), 'files' => array()); |
|
foreach ($filelist['dirs'] as $v) { |
$res['dirs'][] = preg_replace('/^'.preg_quote($remove_path,'/').'/','',$v); |
} |
|
foreach ($filelist['files'] as $v) { |
$f_content = base64_encode(file_get_contents($v)); |
$v = preg_replace('/^'.preg_quote($remove_path,'/').'/','',$v); |
$res['files'][$v] = $f_content; |
} |
|
$res = serialize($res); |
|
if ($gzip) { |
$res = gzencode($res); |
} |
|
return $res; |
} |
} |
|
|
class path |
{ |
function real($p,$strict=true) |
{ |
$os = (DIRECTORY_SEPARATOR == '\\') ? 'win' : 'nix'; |
|
# Chemin absolu ou non ? |
if ($os == 'win') { |
$_abs = preg_match('/^\w+:/',$p); |
} else { |
$_abs = substr($p,0,1) == '/'; |
} |
|
# Transformation du chemin, forme std |
if ($os == 'win') { |
$p = str_replace('\\','/',$p); |
} |
|
# Ajout de la racine du fichier appelant si |
if (!$_abs) { |
$p = dirname($_SERVER['SCRIPT_FILENAME']).'/'.$p; |
} |
|
# Nettoyage |
$p = preg_replace('|/+|','/',$p); |
|
if (strlen($p) > 1) { |
$p = preg_replace('|/$|','',$p); |
} |
|
$_start = ''; |
if ($os == 'win') { |
list($_start,$p) = explode(':',$p); |
$_start .= ':/'; |
} else { |
$_start = '/'; |
} |
$p = substr($p,1); |
|
# Parcours |
$P = explode('/',$p); |
$res = array(); |
|
for ($i=0;$i<count($P);$i++) |
{ |
if ($P[$i] == '.') { |
continue; |
} |
|
if ($P[$i] == '..') { |
if (count($res) > 0) { |
array_pop($res); |
} |
} else { |
array_push($res,$P[$i]); |
} |
} |
|
$p = $_start.implode('/',$res); |
|
if ($strict && !@file_exists($p)) { |
return false; |
} |
|
return $p; |
} |
} |
?> |