Класс для работы с файлами и каталагами
Сам класс
<?php
ini_set('display_errors', false);
class velPath
{
protected $infoLang = array();
protected $flagErr = true;
//сохраняем массивы в свойствах
function __construct($lang='ru',$pach = '') {
$this->infoLang = include $pach.'velPath_'.$lang.'.php';
}
/**
* Создает уникальный набор символов
* $len - Количество символов в случайном имени
*/
function uniqidSymbLinker($len = 5) {
$arr = array_merge( range(0, 9), range('a','z'), range('A', 'Z') );
shuffle($arr);
foreach(array_rand($arr, $len) as $index)
$key .= $arr[$index];
return $key;
}
/**
* Создает уникальный набор символов
* $len - Количество символов в случайном имени
*/
function uniqidSymbTwin($len = 5) {
$a = range(0, 9); $b = range('a','z'); $c = range('A', 'Z');
$arr = array_merge($a, $b); $arr = array_merge($arr, $c); $arr = array_merge($arr, $arr);
$rand = microtime(true); $key = '';
for($i = 0; $i < $len; $i++) {
shuffle($arr);
$key .= $arr[(round(($rand * 1000 - floor($rand * 1000)),2) * 100 )];
$rand = microtime(true);
}
return $key;
}
/**
* Возвращает информацию о пути к файлу
* $flag - Флаг вывода определенной информации. dirname - путь, basename - имя, extension - тип
* По умолчанию возвращаются все элементы
*/
function pathInfo($path, $flag = '') {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
$info = pathinfo($path);
if($flag)
return $info[strtolower($flag)];
else
return $info;
}
/**
* Возвращает новое имя для файла или каталога
* $path - Путь к файлу или каталогу. Если необходимо переименовать файл, то возвращается новое
* имя с типом файла.
* А если надо переименовать каталог, просто возвращается уникальное имя
*/
function newName($path) {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
if(is_dir($path))
return $this->uniqidSymbLinker(rand(7, 18));
else
return $this->uniqidSymbLinker(rand(7, 18)) . '.' . $this->pathInfo($path,'extension');
}
/**
* Переименовывает, перемещает файл или директорию
* $path - Файл или Каталог, который необходимо переименовать или переместить
* $newFile - Новое название файла или каталога. Если оставить пустым или присвоить false,
* будет создаваться новое имя.
* Если ввести путь, отличающийся от исходного, файл или каталог будет перемещен
* $flag - Если установить true, будет браться тип исходника
*/
function editPath($path, $newFile = false, $flag = false) {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
if(!$newFile)
$newFile = $this->newName($path);
else
if(is_file($path) && $flag == true) $newFile = $newFile . '.' . $this->pathInfo($path,'extension');
if(rename($path,$newFile))
return true;
else
return $this->showErr($this->infoLang['errEditPath']);
}
/**
* Создает новый каталог
* $nameDir - Название папки, которую необходимо создать
* $chmod - Права для папки
*/
function newDir($nameDir, $chmod = 0777){
if(strlen($nameDir) < 1)
return $this->showErr($this->infoLang['errEnterNameNewDir']);
if(mkdir($nameDir, $chmod))
return true;
else
return $this->showErr($this->infoLang['errNewDir']);
}
/**
* Копирует файл
* $path - Путь к файлу, который необходимо скопировать
* $newPath - Новый путь, куда необходимо скопировать файл. По умолчанию создает новое имя
* для файла и копирует в тот же каталог,
* где находится исходник
* $flagExt - Флаг типа. По умолчанию, присваивается тип исходника
*/
function copyFile($path, $newPath = false, $flagExt = false) {
if(!file_exists($path) || !is_file($path))
return $this->showErr($this->infoLang['errExistsPath']);
if(!$newPath)
$newPath = $this->newName($path);
else
if(!$flagExt) $newPath = $newPath . '.' . $this->pathInfo($path,'extension');
if(copy($path,$newPath))
return true;
else
return $this->showErr($this->infoLang['errCopyFile']);
}
/**
* Копирует каталог
* $pathDir - Каталог, который необходимо скопировать
* $outDir - Куда необходимо скопировать.
*/
function copyDir($pathDir, $outDir) {
if(!file_exists($pathDir))
return $this->showErr($this->infoLang['errExistsPath']);
if(!is_dir($outDir))
$this->newDir($outDir);
$dir = opendir($pathDir);
while(false !== ($check = readdir($dir))) {
if($check != '.' && $check != '..') {
if(is_dir($pathDir . '/' . $check)) {
$this->newDir($outDir . '/' . $check);
$this->copyDir($pathDir . '/' . $check, $outDir . '/' . $check);
}
else if(is_file($pathDir . '/' . $check)) {
$this->copyFile($pathDir . '/' . $check, $outDir . '/' . $this->pathInfo($check,'basename'), true);
}
}
}
return true;
}
/**
* Конвертирует размер файла
* $size - Размер файла
*/
function fileSizeFormat($size) {
$pos = 0;
$size = floor($size);
$ar = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' );
while($size >= 1024) {
$size /= 1024;
$pos++;
}
$str = round($size,2) . ' ' . $ar[$pos];
return $str;
}
/**
* Возвращает размер файла
* $path - Абсолютный путь к файлу
* $format - Флаг форматирование размера
*/
function getFileSize($path, $format = false) {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
$size = floor(filesize($path));
if($format)
$size = $this->fileSizeFormat($size);
return $size;
}
/**
* Читает .txt файл
* $pathFile - Путь к файлу, из которого необходимо вытащить текст
* $flag - 1: Возвращает текст в виде одной строки; 2: Возвращает текст в массиве
*/
function readTxt($pathFile,$flag = 1) {
if(!file_exists($pathFile))
return $this->showErr($this->infoLang['errExistsPath']);
if($flag == 1) {
if(file_get_contents($pathFile))
return true;
else
return $this->showErr($this->infoLang['errReadTxt']);
} else {
if(file($this->pathTrim($file)))
return true;
else
return $this->showErr($this->infoLang['errReadTxt']);
}
}
/**
* Создает .txt файл
* $pathFile - Путь, где необходимо создать текстовый документ
* $value - Текст, который необходимо сохранить в файле. По умолчанию документ создается пустой
*/
function newTxt($pathFile,$value = '') {
if(file_put_contents($pathFile,$value))
return true;
else
return $this->showErr($this->infoLang['errNewTxt']);
}
/**
* Удаляет каталог, со всем содержимым
* $path - Путь к дериктории, которую надо удалить
*/
function removeDir($path) {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
if(is_file($path))
return $this->remove($path);
if(!is_dir($path))
return true;
$d = opendir($path);
if(!$d)
return $this->showErr($this->infoLang['errExistsFile']);
while(false !== ($f = readdir($d))) {
if($f == '.' || $f == '..') continue;
$abs = $path . '/' . $f;
$this->removeDir($abs);
}
closedir($d);
if(rmdir($path))
return true;
else
return $this->showErr($this->infoLang['errDeletePath']);
}
/**
* Удаляет файл
* $path - Путь к файлу, который надо удалить
*/
function remove($path) {
if(!file_exists($path))
return $this->showErr($this->infoLang['errExistsPath']);
if(unlink($path))
return true;
else
return $this->showErr($this->infoLang['errDeletePath']);
}
/**
* Возвращает позицию последнего вхождения символа
* $haystack - Строка для поиска
* $needle - Искомый символ
*/
function strPos($haystack, $needle) {
$index = strpos(strrev($haystack), strrev($needle));
if($index === false)
return false;
$index = strlen($haystack) - strlen($needle) - $index;
return $index;
}
/**
* Ищет файл с заданным именем последовательно вверх по иерархии папок.
* Если файл найден - возвращает путь к найденному файлу, в противном случае возвращает сообщение
* $filename - Имя искомого файла.
* $dirstart - Путь к разделу с которого нужно начинать поиск файла. (абсалютный путь от корня сайта)
*/
function searchFile($fileName, $dirStart){
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$dirStart = str_replace($docRoot, '', $dirStart);
if(strlen($dirStart) <= 0)
return $this->showErr($this->infoLang['errExistsPath']);
while(!file_exists($docRoot . '/' . $dirStart . '/' . $fileName)) {
$p = $this->strPos($dirStart, '/');
if($p === false)
break;
$dirStart = substr($dirStart, 0, $p);
}
if($p === false)
return $this->showErr($this->infoLang['errSearchExistsFile']);
return $docRoot . '/' . $dirStart . '/' . $fileName;
}
/**
* Cоздает все каталоги входящие в указанный путь, в случае успеха возвращает true
* $path - Путь. Можно использовать /newFolder, ../newFolder, newFolder/folder
*/
function dirNewPath($path) {
if(strlen($path) < 1 || $path == '/')
return $this->showErr($this->infoLang['errExistsPath']);
$dirs = array();
if(substr($path,0,1) == '/')
$path = $_SERVER['DOCUMENT_ROOT'] . $path;
if(!file_exists($p = $this->strPos($path, '/')))
$this->newDir($p);
while($p > 0) {
if(is_dir($path)) {
if(!is_writable($path)) chmod($path, 0777);
break;
}
$dirs[] = substr($path, $p + 1);
$path = substr($path, 0, $p);
$p = $this->strPos($path, '/');
}
for($i = sizeof($dirs) - 1; $i >= 0; $i--) {
$path = $path . '/' . $dirs[$i];
$this->newDir($path);
}
return true;
}
/**
* Проверяет допустимые размер файла и расширение
* $path - Абсолютный путь к файлу
* $maxsize - максимальный размер файла
* $extlist - список расширений
*/
function fileValid($path, $maxSize = 0, $extList = '') {
if(!is_file($path))
return $this->showErr($this->infoLang['errExistsPath']);
if($this->getFileSize($path) > $maxSize)
return $this->showErr($this->infoLang['errFileSizeOverflow']);
if(strlen(trim($extList)) > 0) {
$list = explode(',', str_replace(' ', '', trim($extList)));
return(sizeof($list) && !in_array($this->pathInfo($path,'extension'), $list))
? $this->showErr($this->infoLang['errFileExtInvalid'] . implode(', ', $list))
: true;
}
return true;
}
/**
* Функция для вывода ошибок
* $err - Сообщение
* $flagErr - true: выводит сообщение; false: выводит текст об ошибке
*/
function showErr($err) {
if($this->flagErr == true)
return $err;
else
return $this->error;
}
}
Языковый файл velPath_ru.php
<?php return array( 'errPathCopyDir' => 'Неверно указана папка, которую надо скопировать', 'errCopyFile' => 'Произошла ошибка при копировании файла', 'errExistsFile' => 'Неверно указан путь к файлу', 'errEnterNameNewDir' => 'Введите название каталога, который надо создать', 'errNewDir' => 'Произошла ошибка при создании каталога', 'errEnterNameCopyPath' => 'Введите название каталога, который надо скопировать', 'errExistsEditPath' => 'Вы ввели путь, на несуществующий каталог', 'errExistsPath' => 'Неверно указан путь к файлу или каталогу', 'errDeletePath' => 'Произошла ошибка при удалении', 'errNewTxt' => 'Произошла ошибка при создании .txt файла', 'errReadTxt' => 'Произошла ошибка при чтении .txt файла', 'errEditPath' => 'Произошла ошибка при редактировании файла', 'errSearchExistsFile' => 'Файл не найден', 'errFileSizeOverflow' => 'Размер файла превышает допустимую норму', 'errFileExtInvalid' => 'Расширение файла не соответсвует стандарту: ', );
Вызов с пояснениями
<?php
$files = new velPath($lang);
// генерируем уникальное имя
$files->uniqidSymb(rand(3,7));
// создаст имя с количеством символов в диапазоне от 3 до 7
$files->uniqidSymb());
// создаст имя с 5 символами
$files->pathTrim('/phpPath\file.php');
// у случае ошибки вернет false. В случае успеха /phpPath/file.php
$files->pathInfo('phpPath/file.php');
// вернет массив с данными: basename - file.php, dirname - phpPath, extension - .php
$files->pathInfo('phpPath/file.php','basename');
// вернет - file.php
$files->pathInfo('phpPath/file.php','dirname');
// вернет - phpPath
$files->pathInfo('phpPath/file.php','extension');
// вернет - .php
$files->newName('phpPath/file.php');
// Если указан путь на папку, вернет случайный набор символов. Если файл,
//вернет уникальное имя + тип файла. Пример: file.php заменился на Fdv87Svfd.php
$files->editPath('phpPath/file.php');
// файл: file.php будет переименован под новым именем, пример: Fdv87Svfd.php
$files->editPath('phpPath/file.php','phpPath/newFile.php');
// файл: file.php будет переименован под новым именем newFile.php
$files->editPath('phpPath/file.php','phpPath/newFile',true);
// файл: file.php будет переименован под новым именем newFile
// + возьмется тип исходника. Итог: newFile.php
$files->editPath('phpPath/file.php','phpPath/2/newFile.php');
// файл: file.php будет перемещен в папку phpPath/2/
$files->newDir('myFiles');
// создастся новая папка рядом с классом. Можно задать права на папку,
// добавив еще один аргумент
$files->copyFile('phpPath/file.php');
// файл: file.php будет скопирован под новым именем в ту же папку, где исходник.
// Пример: Fdv87Svfd.php
$files->copyFile('phpPath/file.php', 'phpPath/2/newFile.php');
// файл: file.php будет скопирован под новым именем newFile.php
// в папку phpPath/2/
$files->editPath('phpPath/file.php','phpPath/2/newFile.php',true);
// файл: file.php будет скопирован под новым именем
// newFile + возьмется тип исходника. Итог: phpPath/2/Fdv87Svfd.php
$this->copyDir('phpPath','newPhpFolder');
// папка phpPath будет скопирована со всем содержимым
// в новую папку newPhpFolder
$this->fileSizeFormat(7000000);
// вернет 6.68 MB. Размер указывается в байтах
$this->getFileSize('phpPath/file.php');
// вернет размер файла в байтах. Пример: 7000000
$this->getFileSize('phpPath/file.php',true);
// вернет 6.68 MB
$this->readTxt('file.txt');
// вернет текст в одной строке
$this->readTxt('file.txt',0);
// вернет массив с количеством строк в файле
$this->newTxt('newFile.txt');
// создаст пустой .txt файл
$this->newTxt('newFile.txt','Всем привет!');
// создаст .txt файл с содержимым: Всем привет!
$this->removeDir('phpPath');
// удаляет все содержимое в папке phpPath + саму папку
$this->remove('phpPath/file.php');
// удалит файл: file.php
$this->searchFile('file.php','phpPath/');
// если найдет, выведет путь к файлу, иначе сообщение.
// Поиск идет вверх по иерархии папок
$this->dirNewPath('/newFolder/php/files/');
// Создаст папки: newFolder + php + files.
// То, есть все папки, которые указаны через слешь
$this->fileValid('phpPath/file.php');
// вернет true
$this->fileValid('phpPath/file.php',8000000);
// проверит файл на размер. В случае успеха вернет true
$this->fileValid('phpPath/file.php',0,'php,jpeg,mp3');
// проверит тип файла.
$this->fileValid('phpPath/file.php',8000000,'php,jpeg,mp3');
// проверит файл на размер и тип. В случае успеха вернет true
<?php
$files = new velPath($lang);
// генерируем уникальное имя
$files->uniqidSymb(rand(3,7)); // создаст имя с количеством символов в диапазоне от 3 до 7
$files->uniqidSymb()); // создаст имя с 5 символами
$files->pathTrim('/phpPath\file.php'); // у случае ошибки вернет false. В случае успеха /phpPath/file.php
$files->pathInfo('phpPath/file.php'); // вернет массив с данными: basename - file.php, dirname - phpPath, extension - .php
$files->pathInfo('phpPath/file.php','basename'); // вернет - file.php
$files->pathInfo('phpPath/file.php','dirname'); // вернет - phpPath
$files->pathInfo('phpPath/file.php','extension'); // вернет - .php
$files->newName('phpPath/file.php'); // Если указан путь на папку, вернет случайный набор символов. Если файл,
//вернет уникальное имя + тип файла. Пример: file.php заменился на Fdv87Svfd.php
$files->editPath('phpPath/file.php'); // файл: file.php будет переименован под новым именем, пример: Fdv87Svfd.php
$files->editPath('phpPath/file.php','phpPath/newFile.php'); // файл: file.php будет переименован под новым именем newFile.php
$files->editPath('phpPath/file.php','phpPath/newFile',true); // файл: file.php будет переименован под новым именем newFile
//+ возьмется тип исходника. Итог: newFile.php
$files->editPath('phpPath/file.php','phpPath/2/newFile.php'); // файл: file.php будет перемещен в папку phpPath/2/
$files->newDir('myFiles'); // создастся новая папка рядом с классом. Можно задать права на папку, добавив еще один аргумент
$files->copyFile('phpPath/file.php'); // файл: file.php будет скопирован под новым именем в ту же папку, где исходник.
//Пример: Fdv87Svfd.php
$files->copyFile('phpPath/file.php', 'phpPath/2/newFile.php'); // файл: file.php будет скопирован под новым именем newFile.php
//в папку phpPath/2/
$files->editPath('phpPath/file.php','phpPath/2/newFile.php',true); // файл: file.php будет скопирован под новым именем
//newFile + возьмется тип исходника. Итог: phpPath/2/Fdv87Svfd.php
$this->copyDir('phpPath','newPhpFolder'); // папка phpPath будет скопирована со всем содержимым
//в новую папку newPhpFolder
$this->fileSizeFormat(7000000); // вернет 6.68 MB. Размер указывается в байтах
$this->getFileSize('phpPath/file.php'); // вернет размер файла в байтах. Пример: 7000000
$this->getFileSize('phpPath/file.php',true); // вернет 6.68 MB
$this->readTxt('file.txt'); // вернет текст в одной строке
$this->readTxt('file.txt',0); // вернет массив с количеством строк в файле
$this->newTxt('newFile.txt'); // создаст пустой .txt файл
$this->newTxt('newFile.txt','Всем привет!'); // создаст .txt файл с содержимым: Всем привет!
$this->removeDir('phpPath'); // удаляет все содержимое в папке phpPath + саму папку
$this->remove('phpPath/file.php'); // удалит файл: file.php
$this->searchFile('file.php','phpPath/'); //если найдет, выведет путь к файлу, иначе сообщение.
//Поиск идет вверх по иерархии папок
$this->dirNewPath('/newFolder/php/files/'); // Создаст папки: newFolder + php + files.
//То, есть все папки, которые указаны через слешь
$this->fileValid('phpPath/file.php'); // вернет true
$this->fileValid('phpPath/file.php',8000000); // проверит файл на размер. В случае успеха вернет true
$this->fileValid('phpPath/file.php',0,'php,jpeg,mp3'); // проверит тип файла.
$this->fileValid('phpPath/file.php',8000000,'php,jpeg,mp3'); // проверит файл на размер и тип. В случае успеха вернет true