mirror of
https://github.com/UnickSoft/graphonline.git
synced 2025-07-01 07:15:29 +00:00
201 lines
6.1 KiB
PHP
Executable File
201 lines
6.1 KiB
PHP
Executable File
<?php
|
||
|
||
/**
|
||
* Класс для работы с каталогами и файлами в системе
|
||
*
|
||
* @author Zmi
|
||
*/
|
||
class FileSys
|
||
{
|
||
private function __construct()
|
||
{
|
||
|
||
}
|
||
|
||
public static function FilenameSecurity($str)
|
||
{
|
||
$bad = array(
|
||
"../",
|
||
"./",
|
||
"<!--",
|
||
"-->",
|
||
"<",
|
||
">",
|
||
"'",
|
||
'"',
|
||
'&',
|
||
'$',
|
||
'#',
|
||
'{',
|
||
'}',
|
||
'[',
|
||
']',
|
||
'=',
|
||
';',
|
||
'?',
|
||
"%20",
|
||
"%22",
|
||
"%3c", // <
|
||
"%253c", // <
|
||
"%3e", // >
|
||
"%0e", // >
|
||
"%28", // (
|
||
"%29", // )
|
||
"%2528", // (
|
||
"%26", // &
|
||
"%24", // $
|
||
"%3f", // ?
|
||
"%3b", // ;
|
||
"%3d" // =
|
||
);
|
||
|
||
return stripslashes(str_replace($bad, '', $str));
|
||
}
|
||
|
||
/**
|
||
* Удаляет каталог с его содержимым
|
||
*/
|
||
public static function DeleteDir($directory)
|
||
{
|
||
$dir = opendir($directory);
|
||
while (($file = readdir($dir)))
|
||
{
|
||
if (is_file($directory . '/' . $file))
|
||
{
|
||
unlink($directory . '/' . $file);
|
||
}
|
||
elseif (is_dir($directory . '/' . $file) && ($file != '.') && ($file != '..'))
|
||
{
|
||
self::DeleteDir($directory . '/' . $file);
|
||
}
|
||
}
|
||
closedir($dir);
|
||
return rmdir($directory);
|
||
}
|
||
|
||
/**
|
||
* Создать каталоги по указанному пути
|
||
*/
|
||
public static function MakeDir($path)
|
||
{
|
||
if (is_dir($path))
|
||
{
|
||
return;
|
||
}
|
||
|
||
$path = explode('/', $path);
|
||
if (count($path) == 1)
|
||
{
|
||
$path = explode('\\', $path[0]);
|
||
}
|
||
|
||
$d = '';
|
||
foreach ($path as $dir)
|
||
{
|
||
$d .= $dir . '/';
|
||
if (!in_array($d, array('/', '/home/')) && !is_dir($d))
|
||
{
|
||
mkdir($d, 0777);
|
||
@chmod($d, 0777);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Cоздать и записать содержимое в файл по указанному пути, если каталоги указанные в пути не созданы, то их создадут
|
||
*/
|
||
public static function WriteFile($file, $data, $flgAppend = false)
|
||
{
|
||
$file = self::FilenameSecurity($file);
|
||
if (!$flgAppend)
|
||
{
|
||
if (file_exists($file))
|
||
{
|
||
@unlink($file);
|
||
}
|
||
}
|
||
|
||
self::MakeDir(dirname($file));
|
||
fclose(fopen($file, 'a+b'));
|
||
$f = fopen($file, $flgAppend ? 'a+b' : 'r+b');
|
||
$ret = fwrite($f, $data);
|
||
fclose($f);
|
||
@chmod($file, 0777);
|
||
return $ret;
|
||
}
|
||
|
||
/**
|
||
* Читает файл по переданному пути
|
||
*/
|
||
public static function ReadFile($file)
|
||
{
|
||
$file = self::FilenameSecurity(trim($file));
|
||
|
||
if (!strlen(trim($file)))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
$b = false;
|
||
if (strstr($file, 'http://') == $file)
|
||
{
|
||
$f = fopen($file, 'rb');
|
||
while (!feof($f))
|
||
{
|
||
$b .= fread($f, 1024);
|
||
}
|
||
}
|
||
elseif (file_exists($file) && is_readable($file))
|
||
{
|
||
$f = fopen($file, 'rb');
|
||
$size = filesize($file);
|
||
$b = ($size == 0) ? "" : fread($f, $size);
|
||
}
|
||
|
||
if (isset($f) && $f)
|
||
{
|
||
fclose($f);
|
||
}
|
||
|
||
return $b;
|
||
}
|
||
|
||
/**
|
||
* Получает список файлов каталога со всеми вложенными каталогами
|
||
*
|
||
* @param string $dir
|
||
* @return array
|
||
*/
|
||
public static function ReadList($dir)
|
||
{
|
||
if (!is_readable($dir))
|
||
{
|
||
return array();
|
||
}
|
||
|
||
$list = array();
|
||
$dir = in_array(substr($dir, -1, 1), array('/', '\\')) ? $dir : "$dir/";
|
||
$hDir = opendir($dir);
|
||
while(($f = readdir($hDir)) !== false)
|
||
{
|
||
if ($f != '.' && $f != '..')
|
||
{
|
||
$path = $dir . $f;
|
||
$list[$f] = is_dir($path) ? self::ReadList($path) : $path;
|
||
}
|
||
}
|
||
closedir($hDir);
|
||
return $list;
|
||
}
|
||
|
||
/**
|
||
* Возвращает размер файла в виде: Kb Mb Gb
|
||
*/
|
||
public static function Size($file)
|
||
{
|
||
$size = sprintf("%u", filesize($file));
|
||
$filesizename = array(" Bytes", " Kb", " Mb", " Gb", " Tb", " Pb", " Eb", " Zb", " Yb");
|
||
return $size ? round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
|
||
}
|
||
};
|
||
?>
|