[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс для работы с файлами и каталагами
ИНСИ
Переехал в новую страну, интернета нормально тут нет, чтобы быть на форуме, решил сделать класс для работы с файлами и каталогами. Надеюсь пригодится кому нибудь ... Если будут предложения по улучшению или исправлению, буду признателен.

Свернутый текст
ini_set('display_errors', false);

class velPath
{
protected $infoLang = array();
protected $flagErr = true;

//сохраняем массивы в свойствах
function __construct($lang) {
$this->infoLang = $lang;
}

/**
* Создает уникальный набор символов
* $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;
}
}



А также lang файл, чтобы вы смогли редактировать сообщения, который будет выдавать класс....

Свернутый текст
$lang = array(	
'errPathCopyDir' => 'Неверно указана папка, которую надо скопировать',
'errCopyFile' => 'Произошла ошибка при копировании файла',
'errExistsFile' => 'Неверно указан путь к файлу',
'errEnterNameNewDir' => 'Введите название каталога, который надо создать',
'errNewDir' => 'Произошла ошибка при создании каталога',
'errEnterNameCopyPath' => 'Введите название каталога, который надо скопировать',
'errExistsEditPath' => 'Вы ввели путь, на несуществующий каталог',
'errExistsPath' => 'Неверно указан путь к файлу или каталогу',
'errDeletePath' => 'Произошла ошибка при удалении',
'errNewTxt' => 'Произошла ошибка при создании .txt файла',
'errReadTxt' => 'Произошла ошибка при чтении .txt файла',
'errEditPath' => 'Произошла ошибка при редактировании файла',
'errSearchExistsFile' => 'Файл не найден',
'errFileSizeOverflow' => 'Размер файла превышает допустимую норму',
'errFileExtInvalid' => 'Расширение файла не соответсвует стандарту: ',
);


Я постарался написать комментарии так, чтобы было все ясно, но если возникнут вопросы, пишите :) Вот примеры:


$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



А тут можете скачать сам файл. Используя данный класс, можно больше делать. Я лишь стандарт весь объяснил.



Спустя 2 часа, 36 минут, 37 секунд (4.02.2011 - 12:28) Zerstoren написал(а):
Спасибо, полезная вещь.

Лучше напиши про все функции.

$info = $files->fileSizeFormat(7000000);
что возвращает = имя функции( какие параметры и какого типа передаются)

Спустя 1 день, 7 часов, 43 минуты, 7 секунд (5.02.2011 - 20:11) ИНСИ написал(а):
Zerstoren я прислушался и сделал.

Блин, мне обидно. Я дня 2 делал этот класс, а никто даже не отписывается. Неужели никому кроме меня и Zerstoren это не надо?

.... все, пошел горевать smile.gif

Спустя 53 минуты, 6 секунд (5.02.2011 - 21:04) inpost написал(а):
welbox2
Лично мне стиль не нравится, слишком всё налеплено. Часть поехало.

Спустя 8 минут, 30 секунд (5.02.2011 - 21:12) WTFTW написал(а):
раставь ко всем методам public если они у тебя public, составь нормальные доки, а именно по правилам phpdoc. посмотри стандарты оформления кода Zend И PEAR, ты к ним близко уже подошел так что труда перейти не составит.

по существу. бесполезная библиотека, зачем тратить время на изучение надстроек, когда можно все сделать стандартными функциями, имхо.

Спустя 35 минут, 1 секунда (5.02.2011 - 21:47) ИНСИ написал(а):
Цитата
Лично мне стиль не нравится, слишком всё налеплено. Часть поехало.

скачай файл и ты увидишь что стиль у меня нормально написан. Я вставил на форум тут, и код поехал .....

Цитата
составь нормальные доки, а именно по правилам phpdoc

Моей задачей не было сделать класс и продвигать ее. Я сделал класс, который мне точно будет необходим в дальнейшем. Ничего сложного нет в нем, поэтому и доки делать не стоит. Примеры привел, кто не разберется готов помочь ...

Цитата
посмотри стандарты оформления кода Zend И PEAR, ты к ним близко уже подошел так что труда перейти не составит.

Обязательно посмотрю.

Цитата
бесполезная библиотека

Учел ...

Цитата
зачем тратить время на изучение надстроек, когда можно все сделать стандартными функциями, имхо

А я разве сделал что-то нестандартное?

Спустя 5 минут, 41 секунда (5.02.2011 - 21:53) inpost написал(а):
welbox2
Половина табуляцией, половина пробелами.
А эта строчка ты считаешь удобная:
if(is_dir($path)) { if(!is_writable($path)) chmod($path, 0777); break; }

Спустя 37 секунд (5.02.2011 - 21:54) WTFTW написал(а):
Цитата
А я разве сделал что-то нестандартное?

отнюдь, что-то не нужное biggrin.gif

Цитата
Моей задачей не было сделать класс и продвигать ее. Я сделал класс, который мне точно будет необходим в дальнейшем. Ничего сложного нет в нем, поэтому и доки делать не стоит. Примеры привел, кто не разберется готов помочь ...

зачем тогда выложил на обозрение. Да и комментирование кода это способ повысить свой скил.

Спустя 4 минуты, 46 секунд (5.02.2011 - 21:58) ИНСИ написал(а):
inpost не совсем тебя понял. Но вообще в программировании кажется 3 или 4 варианта стиля написания кода. Я выбрал один и по нему пишу.

Цитата
отнюдь, что-то не нужное

Что именно?

Цитата
зачем тогда выложил на обозрение. Да и комментирование кода это способ повысить свой скил.

Выложил для того, чтобы тут доработать класс. Очень хочется сделать простой, но нужный класс для работы с файлами и папками. Тут, знаю есть люди, которые реально могут помочь со знаниями + опытом.

Спустя 2 минуты, 1 секунда (5.02.2011 - 22:00) inpost написал(а):
            if(sizeof($list) > 0 && !in_array($this->pathInfo($path,'extension'), $list))
return $this->showErr($this->infoLang['errFileExtInvalid'] . $extList);

А тут уже другой стиль, с новой строчки.

Спустя 7 минут, 52 секунды (5.02.2011 - 22:08) WTFTW написал(а):
Цитата
Что именно?

Я про твой класс.
Цитата
Выложил для того, чтобы тут доработать класс.
Оо, а тогда почему ты ни как не прокомментировал вот это
Цитата
раставь ко всем методам public если они у тебя public
, это очень хорошее дополнение.
аля PEAR
    if((sizeof($list) > 0) && (!in_array($this->pathInfo($path, 'extension'), $list))){
return $this->showErr($this->infoLang['errFileExtInvalid'] . $extList);
}

ах да забыл, почитай ка про исключения http://pyha.ru/forum/topic/103.0

Спустя 16 часов, 35 минут, 18 секунд (6.02.2011 - 14:44) linker написал(а):
Собственно нет никакой разницы, напишешь ты ты так /phpPath/file.php или так /phpPath\file.php, нет нужны менять направления слэшей, операционка все и так понимает.
Вот эту большую конструкцию
	function __construct($lang) {
$this->infoLang['errPathCopyDir'] = $lang['errPathCopyDir'];
$this->infoLang['errCopyFile'] = $lang['errCopyFile'];
$this->infoLang['errExistsFile'] = $lang['errExistsFile'];
$this->infoLang['errEnterNameNewDir'] = $lang['errEnterNameNewDir'];
$this->infoLang['errNewDir'] = $lang['errNewDir'];
$this->infoLang['errEnterNameCopyPath'] = $lang['errEnterNameCopyPath'];
$this->infoLang['errExistsPath'] = $lang['errExistsPath'];
$this->infoLang['errDeletePath'] = $lang['errDeletePath'];
$this->infoLang['errNewTxt'] = $lang['errNewTxt'];
$this->infoLang['errReadTxt'] = $lang['errReadTxt'];
$this->infoLang['errEditPath'] = $lang['errEditPath'];
$this->infoLang['errSearchExistsFile'] = $lang['errSearchExistsFile'];
$this->infoLang['errFileSizeOverflow'] = $lang['errFileSizeOverflow'];
$this->infoLang['errFileExtInvalid'] = $lang['errFileExtInvalid'];
}
можно заменить на
$this->infoLang = $lang;

Спустя 13 часов, 2 минуты, 22 секунды (7.02.2011 - 03:46) kirik написал(а):
По хорошему класс должен выкидывать исключение с кодом ошибки. А обработка ошибки уже не его проблема.

Спустя 6 часов, 16 минут (7.02.2011 - 10:02) Семён написал(а):
$docRoot  = $_SERVER['DOCUMENT_ROOT'];

user posted image

Спустя 1 минута, 41 секунда (7.02.2011 - 10:04) linker написал(а):
$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);
заменяется на
$arr = array_merge(range(0, 9), range('a','z'), range('A', 'Z'));
Собственно цикл генерации уникального значения работает неправильно, время от времени будет вылетать нотис, с сообщением
Undefined offset: ...
Как я уже сказал, метод pathTrim() не нужен вовсе. И обрати внимание на существование таких функций как basename() и dirname(), чтобы исключить из употребления такой метод как strPos().

Спустя 1 день, 8 часов, 26 минут, 11 секунд (8.02.2011 - 18:30) ИНСИ написал(а):
inpost, WTFTW по поводу стиля согласен. Исправлю чуть позже.

Семён не совсем тебя понял. Что-то не так?

Цитата
По хорошему класс должен выкидывать исключение с кодом ошибки. А обработка ошибки уже не его проблема.

Можешь пример показать? Я понял что ты сказал, но не вижу что это лучше того, что сейчас ..

Цитата
можно заменить на

$this->infoLang = $lang;

согласен. Спасибо, изменю чуть позже ...

Цитата
Как я уже сказал, метод pathTrim() не нужен вовсе

Спасибо. Я не знал что ОС сама редактирует.

Цитата
Собственно цикл генерации уникального значения работает неправильно, время от времени будет вылетать нотис, с сообщением

Я взял решение twin-а, поэтому и не проверял его на работоспособность. Подумаю над своим решением ...

Все, буду исправлять код ...

Спустя 1 час, 57 минут, 14 секунд (8.02.2011 - 20:27) twin написал(а):
welbox2
Цитата
Я взял решение twin-а, поэтому и не проверял его на работоспособность

Цитата
     * Создает уникальный набор символов

Неправда ваша. У меня это функция генерации случайного, а не уникального набора символов. Это совершенно разные вещи.
linker
Цитата

Собственно цикл генерации уникального значения работает неправильно, время от времени будет вылетать нотис

А вот с этого места поподробнее.

PS Увидел. Сократил он функцию. У меня 100 символов, у а тут 99.

Спустя 3 часа, 56 минут, 29 секунд (9.02.2011 - 00:23) linker написал(а):
twin
Я не знаю, насколько копипастнул твой код welbox2, но мне не понятен его смысл, имхо это логичнее
$len = 5;
$arr = array_merge(range(0, 9), range('a','z'), range('A', 'Z'));
shuffle($arr);
$key = implode('', array_rand($arr, $len));

Спустя 15 часов, 55 минут (9.02.2011 - 16:18) ИНСИ написал(а):
Цитата
У меня это функция генерации случайного, а не уникального

Я имел ввиду: Случайный, уникальный набор символов. Кажется эти два слова объясняют одно и тоже...

Цитата
PS Увидел. Сократил он функцию. У меня 100 символов, у а тут 99.

Если честно, то я ничего не удалял.

Спустя 27 минут, 8 секунд (9.02.2011 - 16:46) twin написал(а):
linker
Цитата
Я не знаю, насколько копипастнул твой код welbox2, но мне не понятен его смысл, имхо это логичнее

Дело в том, что моя функция взята из объяснения случайности и псевдослучайности. Твоя выдает псевдослучайную строку, а она вычисляема. Моя выдает совершенно случайную. Потому и большая. Тут она конечно не нужна такая.

welbox2
Цитата
Случайный, уникальный набор символов. Кажется эти два слова объясняют одно и тоже...
Совершенно нет. Случайные строки могут повторяться. Уникальные - никогда. Эта функция не дает уникальности.

Спустя 16 часов, 52 минуты, 5 секунд (10.02.2011 - 09:38) linker написал(а):
twin
Ну давай напиши-ка здесь пример вычисления "псевдослучайности" результата в моем примере.
Понимаешь, ты используешь генератор случайных чисел, а он один на всех и для моего примера и для твоего. Почему так? microtime() - это время, а генератор случайных чисел также работает на тиках.

P.S. Заодно подправлю свой вариант, а то махнул я что-то
$len = 5;
$key = '';
$arr = array_merge(range(0, 9), range('a','z'), range('A', 'Z'));
shuffle($arr);
foreach(array_rand($arr, $len) as $index)
$key .= $arra[$index];

P.S.P.S. Никогда ты не вычислишь значение из моего примера.

Спустя 26 минут, 18 секунд (10.02.2011 - 10:04) twin написал(а):
Цитата
Ну давай напиши-ка здесь пример вычисления "псевдослучайности" результата в моем примере.
У меня нет столько свободного времени, чтобы тратить его на эти алгоритмы. Естественно это довольно сложно. Однако ты заблуждаешься в этом месте:
Цитата
генератор случайных чисел также работает на тиках.

Генератор псевдослучайных чисел работает на так называемом seed (семени).
А эта хрень в пределах одной машины работает одинаково. Тоесть если захоститься рядышком, то можно и попробовть. wordpress или phppbb (не помню точно) так ломали запросто в свое время.

Вот примерно в каком направлении можно думать:
Запускаем скрипт
    echo rand()."<br>";  
echo rand();

Получаем два числа. Допустим 12345 и 54321
Теперь берем первое число, и подставляем в srand()
    srand(12345);  
echo rand();

и на выходе получим то же самое 54321. Эта уязвимость давно описана. И по этому крайне не рекомендуется использовать псевдослучайности в значимых местах. Для того я и писал эту функцию, чтобы показать, как можно сделать действительно случайную строку, с которой можно спать спокойно.

Спустя 1 час, 40 минут, 40 секунд (10.02.2011 - 11:45) linker написал(а):
Псевдослучайные числа - это вычисляемые арифметическими методами числа. rand() таковым не является, здесь идет именно подсчет тиков процессора /dev/random.
А бага, скорее всего была из-за, того не происходила инициализация генератора (стандартный юниксовый генератор подсчитывает тики по прерываниям), в результате чего и происходило зацикливание.

Спустя 1 час, 5 минут, 8 секунд (10.02.2011 - 12:50) twin написал(а):
Цитата
А бага, скорее всего была из-за, того не происходила инициализация генератора

Почему "была"? Она никуда не делась. И факт есть факт - псевдослучайности вычисляются. Пусть даже теоретически.

Спустя 21 минута (10.02.2011 - 13:11) linker написал(а):
Инициализация генератора ее решает.

Спустя 2 часа, 26 минут, 31 секунда (10.02.2011 - 15:37) ИНСИ написал(а):
Код я отредактировал.

А по поводу генерации символов, сделал обе функции. Одну от twin-а, а другую от linker-а. По названиям можно понять smile.gif

linker большое спасибо за твое мнение. Если есть еще, что надо изменить говори, буду рад smile.gif

Спустя 33 минуты, 16 секунд (10.02.2011 - 16:11) linker написал(а):
Здесь
if($maxSize > 0 && $this->getFileSize($path) > $maxSize)
достаточно просто
if($this->getFileSize($path) > $maxSize)
$extList в том же методе лучше по умолчанию сделать массивом и дать возможность отдавать список расширений в виде массива, это расширит функционал и в случае массива избавит код от лишних операций, ниже для размышления:
if(is_string($extList))
{
$extList = trim($extList);
$extList = (!empty($extList)) ? explode(',', str_replace(' ', '', $extList)) : array();
}
return (count($extList) && !in_array($this->pathInfo($path,'extension'), $extList))
?
$this->showErr($this->infoLang['errFileExtInvalid'] . imlode(', ', $extList))
:
true;

Спустя 1 час, 52 минуты, 45 секунд (10.02.2011 - 18:03) ИНСИ написал(а):
Цитата
достаточно просто

if($this->getFileSize($path) > $maxSize)

Согласен. Изменил.

Цитата
$extList в том же методе лучше по умолчанию сделать массивом

Я хотел, но передумал. Я пишу класс для себя, но также и для начинающих программистов. Сделав все в строку, через запятую я облегчил им работу. Поэтому по умолчанию сейчас расширения в строке через запятую.

Цитата
ниже для размышления:

Тоже согласен, код сделан более удобно. Изменил...

Спустя 2 дня, 19 часов, 38 минут, 7 секунд (13.02.2011 - 13:41) WTFTW написал(а):
Цитата (welbox2 @ 8.02.2011 - 15:30)
Можешь пример показать? Я понял что ты сказал, но не вижу что это лучше того, что сейчас ..

		function newTxt($pathFile,$value = '') {
if(file_put_contents($pathFile,$value))
return true;
else
throw new Exception ($this->infoLang['errNewTxt']['0'], $this->infoLang['errNewTxt']['1']);
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.