Класс для работы с файлами и каталагами
Сам класс
<?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