Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мой класс для работы с файлами 
:(
    Опции темы
mr.Anderson
Дата 14.8.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



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

Ссылка на краткое описание класса (там же и ссылка на сам класс): http://homemaster.org.ru/forum/index.php?showtopic=19


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
alergi
Дата 14.8.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 14.8.2006
Где: МОСКВА

Репутация: нет
Всего: нет



идея хорошая, но реализация... короче над ней надо еще поработать
  •  Хорошо, что в классе все методы закоментированы, но лучше было бы, чтобы комментарии соответстволи синтаксису PHPDoc и прочти еще Стандарты кодирования PEAR
  •  Пока что это оболочка для стандартных функций. А хотелось бы видеть чего-то большого: обработка ошибок, поиск файлов и текста файлах, групповые операции с файлами и пр.

P.S. это только первое впечатление, но повторюсь идея неплохая. Посмотри еще на другие подобные классы и возьми из них всё самое лучшее
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 14.8.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Добавил функцию поиска строки в файле. Не проверял, но по логике должно работать.

К слову, у некоторых юзеров возникают вопросы, как его пользовать, этот класс. Создаем в одной папке с классом файл PHP и пишем туда:
Код

<?php

 require_once( "file.class.php" );

 $file = new Files( "filename.txt" );
 $file->Create();
 $file->Open( "w" );
 $file->fWriteString( "mystring" );
 $file->Close();

?>

И запустите его.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
AztEK
Дата 15.8.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: 1
Всего: 18



Пробежался по коду. Мои замечания:

1) Зачем писать вот это:
Код

  var $fileName = NULL;
  var $fileSize = NULL;
  var $desc = NULL;
  var $fullPath = NULL;
  var $fullDir = NULL;
  var $dirName = NULL;
  var $locked = NULL;

Аналогично тому, чтобы вообще ничего не писать  smile 


2) Не работают некоторые ф-ции, в частности, вот эта:
Код

function GetCreateTime()
  {
   return date( $DTM_FORMAT, filectime( $this->fileName ) );
  }

Переменной $DTM_FORMAT в ней нету smile . Это не C++ и this автоматом не ставится.

3) В функции fReadContent() лучше использовать ф-цию file_get_contents(), а не file(). Логичней имхо. И быстрее. А для разбития файла на массви имхо лучше сделать отдельную ф-цию.

4) Странная ф-ция GetStatus().  smile Может она лучше будет CHMOD файла выводить?

5) Ф-ция fReadLine( $lineNumber ). В ней нерационально использовать file(). Вдруг будет файл с 100000000 строк и надо выдать 9999999? Производительность никакая. Лучше ручками через fgets() и feof().

6) 
Цитата(alergi @  14.8.2006,  21:35 Найти цитируемый пост)
 Хорошо, что в классе все методы закоментированы, но лучше было бы, чтобы комментарии соответстволи синтаксису PHPDoc и прочти еще Стандарты кодирования PEAR
 Спорное утверждение на мой взгляд. Лучше функции нормально задокументировать (т.е. аргументы такие-то, возвращает это, делает это).

7)
Цитата(alergi @  14.8.2006,  21:35 Найти цитируемый пост)
 Пока что это оболочка для стандартных функций. А хотелось бы видеть чего-то большого: обработка ошибок, поиск файлов и текста файлах, групповые операции с файлами и пр.
 С этим соглашусь.



--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
mr.Anderson
Дата 15.8.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Цитата
Зачем писать

А чтобы понятно было, какие переменные используются. smile Мне лично так больше нравится.
Цитата
не работают функции

Ой, точняк. Там же надо было $this->DTM_FORMAT написать... эх... никак к синтаксису классовых переменных не привыкну. smile
Цитата
file_get_contents()

Не знаком с этой функцией, если честно, потому и не юзал... Да file() как-то привычнее.
Цитата
GetStatus()

Да она мне и самому не нравилась... Я лучше уберу ее, я и сам не больно понимаю, как она работает. smile
Цитата
freadline()

Ок.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Vaulter
Дата 16.8.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



хм... мне вот достаточно вот такого класса:
Код

class cFiles
{
 function upload($inputname,$uploadpath='downloads',$order_id=null,$iswork = false,$comment=null,$type = 0,$onlyarc = true,$filesize = 10000000);
 function delete($fid);
 function formatsize($size);
}

все остальное пишется на ура обычными фун-ями PHP...
че велосипед то изобретать???


--------------------
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 16.8.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Vaulter, ну, если достаточно, то и хорошо. В этом классе я сделал оболочку для многих часто используемых стандартных функций. В частности, чтобы вам выбрать определенную строку из файла, что придется сделать? Правильно, писать строчек пять-шесть минимум. А с моим классом все в одну строчку обходится. И так далее.

Так. Класс обновил. Добавил и исправил несколько функций, модифицировал функции с учетом вышесказанных замечаний, в частности, заменил file() на fgets(). Все полностью работоспособно, вроде бы.

Скачивать по той же ссылке, в последнем сообщении.
Еще раз прошу потестить.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mal Hack
Дата 16.8.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



sim7, будь другом, положи его сюда кодом...
PM ICQ   Вверх
mr.Anderson
Дата 16.8.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Прям весь код выложить? А мож, лучше файл? Там-таки 555 строк кода...
Ну, если нужно, хорошо:
Код

<?php

 //*******************************//
 //**** Copyright (c) RS_Briz ****//
 //*******************************//
 
 //У всех функций (кроме конструктора) указаны:
 //1. Тип возвращаемого значения.
 //2. Назначение.
 //3. Что возвращает.
 //Так будет удобнее работать с классом.
 
 CLASS Files
 {
  //переменные класса
  var $fileName = NULL; //имя файла
  var $fileSize = NULL; //размер файла
  var $desc = NULL; //дескриптор файла
  var $fullPath = NULL; //полный путь к файлу
  var $fullDir = NULL; //полная директория без имени файла (например, "C:/documents/")
  var $dirName = NULL; //имя папки, в которой лежит файл
  var $locked = NULL; //индикатор блокировки файла
  var $opened = NULL; //индикатор открытия файла (если TRUE, то файл открыт) 

  //конфигурационные переменные
  var $DTM_FORMAT = "d:m:Y H:i:s"; //формат, в котором будет выводиться информация из функций Get...()
  var $DEFAULT_LOCK_MODE = "LOCK_EX"; //режим блокировки по умолчанию

  //******************************************************
  //******************************************************
  //******************************************************
  
  /*********************************************************/
  /**** Сначала идут функции открытия и закрытия файла, ****/
  /****       его блокировки, а также конструктор.      ****/
  /*********************************************************/
  
  //Тип: CONSTRUCTOR
  //Инициализирует все переменные класса, если есть такая возможность.
  //Если второй параметр true, то файл автоматически создастся (задано по умолчанию).
  function Files( $fname, $create = TRUE )
  {
   $this->fileName = $fname; //задаем имя
   
   if( $this->IsExists() )
   {
    $this->fileSize = $this->GetSize(); //задаем размер
    $this->fullPath = dirname( $this->fileName ).basename( $this->fileName ); //задаем полный путь
    $this->fullDir = dirname( $this->fileName ); //задаем полную директорию
    $this->dirName = substr( $this->fullDir, strrpos( $this->fullDir, "/" ) ); //получаем только имя папки
    $this->locked = FALSE; //устанавливаем индикатор блокировки в FALSE
   }
   
   if( $create )
    $this->Create();
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция создает файл в текущем каталоге. Возвращает TRUE в случае успеха.
  //Также возвращает TRUE, если файл уже существует.
  function Create()
  {
   if( $this->IsExists() )
    return TRUE;
   
   $this->Open( "a+" ); //открываем
   $this->Close(); //и сразу закрываем
   
   if( $this->IsExists() )
    return TRUE;
   
   return FALSE;
  }
  
  //Тип: MIXED ( BOOL + POINTER )
  //Функция открывает файл в заданном режиме.
  //Возвращает дескриптор в случае успеха и -1 в случае провала.
  function Open( $mode ) 
  {
   $modeArr = array( "r", //формируем массив возможных режимов (режим бинарного файла НЕ предусмотрен)
                     "r+",
                     "w",
                     "w+",
                     "a",
                     "a+",
                     "rb",
                     "r+b",
                     "wb",
                     "w+b",
                     "ab",
                     "a+b" );
                     
   if( ! in_array( $mode, $modeArr ) )
    return FALSE;

   $this->desc = FOPEN( $this->fileName, $mode ); //устанавливаем дескриптор
   
   if( $this->desc === FALSE ) //если дескриптор равен 0 (т.е. если функция FOPEN() сгенерировала ошибку)
    return -1; //то возвращаем -1
    
   //проставляем все параметры
   if( $this->fileSize === NULL ) //если хоть один параметр NULL, то и все остальные тоже
   {
    $this->fileSize = $this->GetSize(); //задаем размер
    $this->fullPath = dirname( $this->fileName ).basename( $this->fileName ); //задаем полный путь
    $this->fullDir = dirname( $this->fileName ); //задаем полную директорию
    $this->dirName = substr( $this->fullDir, strrpos( $this->fullDir, "/" ) ); //получаем только имя папки
    $this->locked = FALSE; //устанавливаем индикатор блокировки в FALSE
   }
   
   $this->opened = TRUE; //индикатор открытия ставим в TRUE

   return $this->desc; //возвращаем дескриптор
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция закрывает файл.
  function Close()
  {
   if( $this->locked ) //если на файле стоит блокировка, автоматом снимаем ее во избежание простоя сервера
    $this->Unlock();

   if( ! FCLOSE( $this->desc ) ) //если не удалось закрыть файл, генерируем ошибки
    return FALSE;
   
   $this->opened = FALSE; //говорим, что файл закрыт
   $this->desc = NULL; //сбрасываем дескриптор и индикатор блокировки, остальные параметры оставляем
   $this->locked = FALSE;
   
   return TRUE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция устанавливает блокировку на файл, используя дескриптор.
  //В качестве аргумента принимает тип блокировки (стандартные константы - LOCK_SH, LOCK_EX, LOCK_UN, ... + LOCK_NB )
  //Возвращает TRUE в случае успеха, FALSE в противном случае.
  function Lock( $type )
  {
   if( FLOCK( $this->desc, $type ) )
   {
    $this->locked = TRUE;

    return TRUE;
   }
   
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция снимает блокировку с файла через дескриптор.
  //Возвращает TRUE в случае успеха.
  function Unlock()
  {
   if( FLOCK( $this->desc, LOCK_UN ) )
   {
    $this->locked = FALSE;
    
    return TRUE;
   }  
   
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  /*****************************************************************/
  /**** Далее прописываем функции для получения данных о файле. ****/
  /*****************************************************************/
  
  //Тип: BOOL
  //Возвращает true, если файл существует
  function IsExists()
  {
   return file_exists( $this->fileName );
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + STRING )
  //Функция возвращает абсолютный путь к файлу, основываясь на его имени.
  function GetAbsolutePath()
  {
   if( $this->IsExists() )
    return realpath( $this->fileName );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: STRING
  //функция возвращает имя файла.
  function GetName()
  {
   return $this->fileName;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + INT )
  //Эта функция возвращает размер файла в байтах.
  function GetSize()
  {
   if( ( $this->fileSize !== NULL ) && $this->IsExists() )
    return filesize( $this->fileName );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + STRING )
  //Возвращает время последнего доступа к файлу в заданном выше формате.
  function GetLastAccess()
  {
   if( $this->IsExists() )
    return date( $this->DTM_FORMAT, fileatime( $this->fileName ) ); 

   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + STRING )
  //Возвращает время последнего изменения файла в том же формате
  function GetLastModified()
  {
   if( $this->IsExists() )
    return date( $this->DTM_FORMAT, filemtime( $this->fileName ) );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + STRING )
  //Возвращает время создания файла.
  function GetCreateTime()
  {
   if( $this->IsExists() )  
    return date( $this->DTM_FORMAT, filectime( $this->fileName ) );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  /**************************************************/
  /**** Далее функции для манипулирования файлом ****/
  /**************************************************/
  
  //Тип: BOOL
  //Функция копирует файл в директорию $destination.
  //Возвращает TRUE, если файл удалось скопировать, и FALSE в обратном случае.
  function fCopy( $destination )
  {
   if( ! is_dir( $destination ) )
    return FALSE;
   
   return copy( $this->fileName, $destination );
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция переименовывает файл.
  function fRename( $newName )
  {
   if( rename( $this->fileName, $newName ) )
    $this->fileName = $newName;   
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция удаляет файл.
  //Возвращает TRUE в случае успеха и FALSE в случае провала.
  function fDelete()
  {
   if( $this->IsExists() )
    unlink( $this->fileName );
    
   if( ! $this->IsExists() )
   {
    //сбрасываем все текущие параметры
    $fileName = NULL;
    $fileSize = NULL;
    $desc = NULL;
    $fullPath = NULL;
    $fullDir = NULL;
    $dirName = NULL;
    $locked = NULL;
    $opened = NULL;

    return TRUE;
   }
   
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  /************************************************************/
  /**** Далее идут функции для управления содержимым файла ****/
  /************************************************************/
  
  //Тип: MIXED ( BOOL + STRING )
  //Функция возвращает содержимое файла в виде одной строки.
  function fReadToStr()
  {
   if( ! is_readable( $this->fileName ) ) //если нельзя читать файл, то возвращаемся
    return FALSE;
    
   if( ! $this->opened ) //если файл не открыт
    $this->Open( "r" ); //открываем на чтение
   
   $res = ""; //в эту переменную будет записывать все строчки файла
   
   while( ! feof( $this->desc ) ) //пробегаемся по всем строчкам файла
    $res .= fgets( $this->desc ); //и пишем их в строковую переменную
    
   return $res; //возвращаем полученную строку
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + ARRAY )
  //Функция возвращает содержимое файла в виде массива.
  function fReadToArray()
  {
   if( ! is_readable( $this->fileName ) ) //если нельзя читать файл, то возвращаемся
    return FALSE;
    
   if( ! $this->opened ) //если файл не открыт
    $this->Open( "r" ); //открываем на чтение
   
   $resArr = array(); //массив, куда будем писать
   
   while( ! feof( $this->desc ) ) //пробегаемся по всем строчкам файла
    $resArr[] = fgets( $this->desc ); //и пишем каждую строку в следующий элемент массива
    
   return $resArr; //возвращаем получившийся массив
  }
  
  //Тип: MIXED ( BOOL + STRING )
  //Функция читает ОДНУ указанную строку из файла и возвращает ее. В случае, если файл нельзя прочитать,
  //возвращает FALSE.
  //Нужно заметить, что строки нумеруются с единицы (первая, вторая и т.д.).
  function fReadLine( $lineNumber )
  {
   if( ! is_readable( $this->fileName ) ) //если файл нельзя читать - это ошибка
    return FALSE;
    
   if( ! $this->opened ) //если файл не был открыт
    $this->Open( "r" ); //открываем на чтение
      
   for( $i=1; ( ! feof( $this->desc ) ); $i++ ) //цикл со счетчиком строк до конца файла
   {
    $currentStr = fgets( $this->desc ); //получаем текущую строку

    if( $i == $lineNumber ) //если нужный номер строчки найден
     break; //выходим из цикла (переменная $currentStr уже содержит нужную строку)
     
    if( feof( $this->desc ) && ( $i < $lineNumber ) ) //если конец файла достигнут, а переменная номера все еще меньше нужного
     return FALSE; //то выходим (это значит, что такой строки в файле попросту нет
   }
   
   return $currentStr; //если все в порядке, возвращаем найденную строку
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция записывает строку в файл, возвращает TRUE в случае успешной записи.
  //Если второй параметр задан, то пишется строка заданной длины.
  //Если третий параметр TRUE, то после записи с файла снимается блокировка.
  function fWriteString( $string, $length = 0, $disableLock = FALSE )
  {
   if( ! is_writeable( $this->fileName ) ) //если запись невозможна, возвращаемся
    return FALSE;
   
   $fsize = $this->fileSize; //получаем текущий размер файла (будет нужно ниже)
   
   if( ! $this->opened ) //если файл не открыт, возвращаемся, т.к. нам неизвестен нужный режим открытия
    return FALSE;

   if( strlen( $string ) === 0 ) //если длина заданной строки нулевая, то и записывать нечего
    return FALSE;
   
   if( ! $this->locked ) //если блокировка не установлена, устанавливаем ее
    $this->Lock( $this->DEFAULT_LOCK_MODE ); 
    
   if( $length === 0 ) //если длина не задана, не учитываем ее
    fputs( $this->desc, $string );
   else //иначе пишем строку заданной длины
    fputs( $this->desc, $string, $length );
   
   if( $disableLock ) //если надо выключить блокировку, выключаем
    $this->Unlock();
    
   $this->fileSize = $this->GetSize(); //устанавливаем новый размер файла
   
   if( $fsize !== $this->fileSize ) //если размер изменился, значит, запись прошла успешно
    return TRUE;
   
   return FALSE; //иначе возвращаем FALSE
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция записывает массив в файл. Каждый элемент отделяется от предыдущего через символ, заданный во втором параметре.
  //Если третий параметр TRUE, то в файл запишутся еще и ключи, разделенные символом, заданным в четвертом параметре.
  //Если пятый параметр TRUE, то блокировка после записи снимается.
  //Функция работает почти аналогично предыдущей.
  function fWriteArray( $array, $strDelimeter = "\n", $writeKeys = FALSE, $keysDelimeter = "", $disableLock = FALSE )
  {
   if( ! is_writeable( $this->fileName ) ) //по аналогии - нельзя записывать - ну и не будем
    return FALSE;
    
   if( ! $this->opened ) //если файл не был открыт, возвращаемся
    return FALSE;
   
   if( $writeKeys && empty( $keysDelimeter ) ) //если нужно записать ключи, но не задан разделитель, это - ошибка
    return FALSE;
    
   if( count( $array ) === 0 ) //если массив пуст, то и записывать нечего
    return FALSE;
    
   $fsize = $this->fileSize; //получаем текущий размер файла
    
   if( $writeKeys ) //если нужно записать ключи, пишем
    foreach( $array as $k => $v )
     fputs( $this->desc, ( $k.$keysDelimeter.$v.$strDelimeter ) );
    
   else //иначе записываем только значения
    foreach( $array as $v )
     fputs( $this->desc, ( $v.$strDelimeter ) );
     
   if( $disableLock ) //надо выключить блокировку - выключаем
    $this->Unlock();
    
   $this->fileSize = $this->GetSize(); //задаем новый размер
   
   if( $fsize !== $this->fileSize ) //дальше по аналогии с предыдущей функцией
    return TRUE;
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + INT )
  //Функция возвращает текущую позицию указателя в файле или FALSE, если файл не
  //был открыт.
  function GetSeekPos()
  {
   if( $this->opened ) //если файл открыт
    return ftell( $this->desc ); //то можно получить позицию указателя, что мы и делаем
    
   return FALSE; //иначе возвращаемся
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + INT )
  //Функция устанавливает указатель в нужную позицию. Вместо указания точного значения,
  //можно использовать константы SEEK_SET, SEEK_CUR, SEEK_END . Вторым параметром
  //функция может принимать смещение (по умолчанию оно установлено в ноль).
  //Возвращается новая позиция указателя или FALSE, если файл не был открыт.
  function SetSeekPos( $pos, $offset = 0 )
  {
   if( $this->opened ) //если файл открыт
    return fseek( $this->desc, $offset, $pos ); //устанавливаем позицию и возвращаем ее
    
   return FALSE; //иначе возвращаем FALSE
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция урезает размер файла до заданного.
  //Возвращает TRUE в случае успеха.
  function Truncate( $newSize )
  {
   if( $this->opened ) //если файл открыт
    return ftruncate( $this->desc, $newSize ); //урезаем до нужного размера
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция стирает файл.
  //Возвращает TRUE в случае успеха.
  function Clear()
  {
   if( $this->opened ) //если файл открыт
    return ftruncate( $this->desc, 0 ); //стираем файл через fTruncate()
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: BOOL
  //Функция записывает на диск все изменения, произошедшие с файлом, через функцию fFlush().
  function FlushBuffer()
  {
   if( $this->opened )
    return fflush( $this->desc );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: INT 
  //Функция задает размер буфера для файла.
  //Возвращает новый размер буфера.
  function SetBuffer( $buf )
  {
   if( $this->opened )
    return set_file_buffer( $this->desc, $buf );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
  
  //Тип: MIXED ( BOOL + INT )
  //Функция отключает буфферизацию файла.
  //Всегда возвращает 0, даже в случае, если файл закрыт (тогда она вернет FALSE, что равно 0).
  function DisableBufferization()
  {
   if( $this->opened )
    return set_file_buffer( $this->desc, 0 );
    
   return FALSE;
  }
  //******************************************************
  //******************************************************
 
 } //окончание класса
 
?>



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mal Hack
Дата 16.8.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Все слишком, так сказать, нагружено.
Есть, когнечно ряд моментов, которые не влияют на работу, но с точки зрения проектирования они не являются корректными.
Позволю себе показать свой код недописанного файлового менеджера. Недописан в части небольших фич. Я думаю, ознакомившись с кодом ты сделаешь несколько исправлений в своем. Это не просто класс, а модуль, это важное дополноение.
Я удалил методы, отвечающие за работу самого модуля (основные). И обрати внимание на обработку ошибок.
Хотя сейчас я бы сделал через try/catch/throw.
Код
<?php

class Modul
 {
  var $LNG         = array();
  var $CFG         = array();
  var $TEXT        = "";

  var $TEMP_DIR    = "";
  var $TEMP_FILE   = "";
  var $TEMP_ACTION = "";
  
  var $DIRS        = array();
  var $FILES       = array();
  
  var $ERROR_TYPE = "";
    
  function __constructor()
   {
    $this -> TEMP_ACTION = ( $_SERVER['REQUEST_METHOD'] == 'POST' )
                           ? ( ( ! empty( $_POST['action'] ) ) ? $_POST['action'] : "" )
                           : ( ( ! empty( $_GET['action'] ) ) ? $_GET['action'] : "" );
    
    $this -> TEMP_DIR  = ( $_SERVER['REQUEST_METHOD'] == 'POST' )
                         ? ( ( ! empty( $_POST['dir'] ) ) ? $_POST['dir'] : "/" )
                         : ( ( ! empty( $_GET['dir'] ) ? $_GET['dir'] : "/" ) );
                         
    $this -> TEMP_FILE = ( $_SERVER['REQUEST_METHOD'] == 'POST' )
                         ? ( ( ! empty( $_POST['file'] ) ) ? $_POST['file'] : "" )
                         : ( ( ! empty( $_GET['file'] ) ? $_GET['file'] : "" ) );
                         
    $this -> TEMP_DIR  = str_replace( "\\" , "" , $this -> TEMP_DIR );
    
    $this -> TEMP_DIR  = preg_replace( "#/+#" , "/" , $this -> TEMP_DIR );
    $this -> TEMP_FILE = preg_replace( "#/+#" , "/" , $this -> TEMP_FILE );
    $this -> TEMP_DIR  = preg_replace( "#(\.\.|\.)/#" , "" , $this -> TEMP_DIR );
    $this -> TEMP_FILE = preg_replace( "#(\.\.|\.)/#" , "" , $this -> TEMP_FILE );

    if( $this -> TEMP_DIR[0] != "/" ) 
     {  $this -> TEMP_DIR = "/" . $this -> TEMP_DIR;  }   
    
    if( $this -> TEMP_DIR[ strlen( $this -> TEMP_DIR ) - 1 ] == "/" )
     {  $this -> TEMP_DIR = substr( $this -> TEMP_DIR , 0 , -1 );  }
     
    if( @ opendir( $this -> CFG['base_path'] . $this -> TEMP_DIR ) )
     {  @ chdir( $this -> CFG['base_path'] . $this -> TEMP_DIR );  }
    else 
     { 
      $this -> ERROR_TYPE = "DIR_404";     
      $this -> TEMP_DIR   = "/";
      @ chdir( $this -> CFG['base_path'] );  
     }
     
    if( ! empty( $this -> TEMP_FILE ) ) 
     {
      if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $this -> TEMP_FILE ) )
       {  $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
      if( ! file_exists( $this -> TEMP_FILE ) )
       {  $this -> ERROR_TYPE = "FILE_404";  }
     }
   }
   
  function mod_get_dir_contents()
   { 
    $d = opendir( "./" );

    if( !$d ) {  return;  }
    
    while( ( $e = readdir( $d ) ) !== FALSE )
     {
      if( is_dir( $e ) && $e != "." )
       {
        $n = count( $this -> DIRS );
        
        $this -> DIRS[ $n ]['name']    = $e;  
        $this -> DIRS[ $n ]['perm']    = $this -> mod_get_perms_as_string( fileperms( $e ) );
        $this -> DIRS[ $n ]['permas']  = $this -> mod_get_perms_as_array_string( fileperms( $e ) );
       }
      elseif( is_file( $e ) )
       {  
        $n = count( $this -> FILES );
        
        $this -> FILES[ $n ] = $this -> mod_get_file_info( $e );  
       }
     } 
   }

  function mod_get_file_info( $filename )  
   {
    $file['name']    = $filename;
    $file['path']    = realpath( $filename );
    $file['perms']   = $this -> mod_get_perms_as_string( fileperms( $filename ) );
    $file['permas']  = $this -> mod_get_perms_as_array_string( fileperms( $filename ) );
    $file['size']    = $this -> mod_get_filesize_as_string( filesize( $filename ) );
    $file['ctime']   = date( "d.m.Y H:i" , filectime( $filename ) );
    $file['atime']   = date( "d.m.Y H:i" , fileatime( $filename ) );
    $file['mtime']   = date( "d.m.Y H:i" , filemtime( $filename ) ); 
    
    return $file;
   }
   
  function mod_get_perms_as_string( $perms )
   {
    if     ( ( $perms & 0xC000 ) == 0xC000 ) {  $info = 's';  }
    elseif ( ( $perms & 0xA000 ) == 0xA000 ) {  $info = 'l';  } 
    elseif ( ( $perms & 0x8000 ) == 0x8000 ) {  $info = '-';  }
    elseif ( ( $perms & 0x6000 ) == 0x6000 ) {  $info = 'b';  }
    elseif ( ( $perms & 0x4000 ) == 0x4000 ) {  $info = 'd';  }
    elseif ( ( $perms & 0x2000 ) == 0x2000 ) {  $info = 'c';  }
    elseif ( ( $perms & 0x1000 ) == 0x1000 ) {  $info = 'p';  }
    else                                     {  $info = 'u';  }

    $info .= ( $perms & 0x0100 ) ? 'r' : '-';
    $info .= ( $perms & 0x0080 ) ? 'w' : '-';
    $info .= ( $perms & 0x0040 ) 
             ? ( ( $perms & 0x0800 ) ? 's' : 'x' ) 
             : ( ( $perms & 0x0800 ) ? 'S' : '-');

    $info .= ( $perms & 0x0020 ) ? 'r' : '-';
    $info .= ( $perms & 0x0010 ) ? 'w' : '-';
    $info .= ( $perms & 0x0008 ) 
             ? ( ( $perms & 0x0400 ) ? 's' : 'x' ) 
             : ( ( $perms & 0x0400 ) ? 'S' : '-');

    $info .= ( $perms & 0x0004 ) ? 'r' : '-';
    $info .= ( $perms & 0x0002 ) ? 'w' : '-';
    $info .= ( $perms & 0x0001 ) 
             ? ( ( $perms & 0x0200 ) ? 't' : 'x' ) 
             : ( ( $perms & 0x0200 ) ? 'T' : '-');
    
    return $info;         
   } 
  
  function mod_get_perms_as_array_string( $perms )
   {
    $info  = "";
    $info .= ( $perms & 0x0100 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0080 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0040 ) 
             ? ( ( $perms & 0x0800 ) ? '0,' : '1,' ) 
             : ( ( $perms & 0x0800 ) ? '0,' : '0,');

    $info .= ( $perms & 0x0020 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0010 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0008 ) 
             ? ( ( $perms & 0x0400 ) ? '0,' : '1,' ) 
             : ( ( $perms & 0x0400 ) ? '0,' : '0,');

    $info .= ( $perms & 0x0004 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0002 ) ? '1,' : '0,';
    $info .= ( $perms & 0x0001 ) 
             ? ( ( $perms & 0x0200 ) ? '0,' : '1,' ) 
             : ( ( $perms & 0x0200 ) ? '0,' : '0,');
    
    return substr( $info , 0 , -1 );
   } 
  
  function mod_get_perms_as_integer( $perms )
   {
    $u = $g = $o = 0;
    
    $u = ( ( isset( $perms['ur'] ) ) ? 4 : 0 ) + ( ( isset( $perms['uw'] ) ) ? 2 : 0 ) + ( ( isset( $perms['ue'] ) ) ? 1 : 0 );
    $g = ( ( isset( $perms['gr'] ) ) ? 4 : 0 ) + ( ( isset( $perms['gw'] ) ) ? 2 : 0 ) + ( ( isset( $perms['ge'] ) ) ? 1 : 0 );
    $o = ( ( isset( $perms['or'] ) ) ? 4 : 0 ) + ( ( isset( $perms['ow'] ) ) ? 2 : 0 ) + ( ( isset( $perms['oe'] ) ) ? 1 : 0 );

    return sprintf( "0%d%d%d" , $u , $g , $o );
   } 
  
  function mod_get_filesize_as_string( $filesize ) 
   {
    if( $filesize < 1024 )
     {  return $filesize . " b";  }
    elseif( $filesize < 1048576 ) 
     {  return round( ( $filesize / 1024 ) , 2 ) . " Kb";  }
    elseif( $filesize < 1073741824 ) 
     {  return round( ( $filesize / 1048576 ) , 2 ) . " Mb";  }
    elseif( $filesize < 1099511627776 ) 
     {  return round( ( $filesize / 1073741824 ) , 2 ) . " Gb";  }
    else
     {  return round( ( $filesize / 1099511627776 ) , 2 ) . " Tb";  }
   }
       
  function mod_external_file_download()
   {
    header( "Content-type: application/x-download" );
    header( "Content-Disposition: attachment; filename=" . $this -> TEMP_FILE . ";" );
    header( "Accept-Ranges: bytes" );
    header( "Content-Length: " . filesize( $this -> TEMP_FILE ) );

    readfile( $this -> TEMP_FILE );  
   }
   
  function mod_post_dir_new( $dir_name )  
   {
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $dir_name ) )
     {  return $this -> ERROR_TYPE = "DIR_ILLEGAL_NAME";  }
     
    if( @ opendir( $dir_name ) )
     {  return $this -> ERROR_TYPE = "DIR_EXISTS";  }
      
    if( ! @ mkdir( $dir_name ) )
     {  return $this -> ERROR_TYPE = "DIR_FAILED_CREATE";  }
     
    if( ! @ chmod( $dir_name , 0755 ) )
     {  return $this -> ERROR_TYPE = "DIR_FAILED_CHMOD";  }
     
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }
    
  function mod_post_dir_delete( $dirname , $yes )  
   {
    $dirname = preg_replace( "#/+#" , "/" , $dirname );
    $dirname = preg_replace( "#(\.\.|\.)/#" , "" , $dirname );
    
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $dirname ) )
     {  return $this -> ERROR_TYPE = "DIR_ILLEGAL_NAME";  }
     
    if( ! @ opendir( $dirname ) )
     {  return $this -> ERROR_TYPE = "DIR_404";  }
      
    if( $yes == TRUE )
     {  rmdir( $dirname );  }
    
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }

  function mod_post_file_new( $file_name )  
   {
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $file_name ) )
     {  return $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
    if( file_exists( $file_name ) )
     {  return $this -> ERROR_TYPE = "FILE_EXISTS";  }
      
    if( ! @ touch( $file_name ) )
     {  return $this -> ERROR_TYPE = "FILE_FAILED_CREATE";  }
     
    if( ! @ chmod( $file_name , 0644 ) )
     {  return $this -> ERROR_TYPE = "FILE_FAILED_CHMOD";  }
     
    header( "Location: ?dir=" . $this -> TEMP_DIR . "&file=" . $file_name ); 
    exit;
   }
    
  function mod_post_file_edit( $file_code )  
   {
    if( ! is_writeable( $this -> TEMP_FILE ) )
     {  return $this -> ERROR_TYPE = "FILE_UNWRITEABLE";  }
     
    $f = fopen( $this -> TEMP_FILE , "w+" );
    fwrite( $f , $file_code , strlen( $file_code ) );
    fclose( $f );
     
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }

  function mod_post_file_delete( $filename , $yes )  
   {
    $filename = preg_replace( "#/+#" , "/" , $filename );
    $filename = preg_replace( "#(\.\.|\.)/#" , "" , $filename );
    
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
    if( ! file_exists( $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_404";  }
      
    if( $yes == TRUE )
     {   unlink( $filename );  }
    
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }

  function mod_post_file_copy( $filename , $new_dir , $ren )  
   {
    $new_dir  = preg_replace( "#/+#" , "/" , $new_dir );
    $new_dir  = preg_replace( "#(\.\.|\.)/#" , "" , $new_dir );
    $filename = preg_replace( "#/+#" , "/" , $filename );
    $filename = preg_replace( "#(\.\.|\.)/#" , "" , $filename );
    
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
    if( ! file_exists( $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_404";  }
      
    if( ! preg_match( "#^[a-z0-9_.-/]+$#i" , $new_dir ) )
     {  return $this -> ERROR_TYPE = "DIR_ILLEGAL_NAME";  }
     
    if( ! @ opendir( $this -> CFG['base_path'] . $new_dir ) )
     {  return $this -> ERROR_TYPE = "DIR_404";  }
          
    if( file_exists( $this -> CFG['base_path'] . $new_dir . "/" . $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_EXISTS";  }
      
    if( $ren == FALSE ) 
     {  copy( $filename , $this -> CFG['base_path'] . $new_dir . "/" . $filename );  }
    else 
     {  rename( $filename , $this -> CFG['base_path'] . $new_dir . "/" . $filename );  }
     
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }

  function mod_post_properties_file( $filename , $perms , $file_new_name )  
   {
    $filename = preg_replace( "#/+#" , "/" , $filename );
    $filename = preg_replace( "#(\.\.|\.)/#" , "" , $filename );
    
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
    if( ! file_exists( $filename ) )
     {  return $this -> ERROR_TYPE = "FILE_404";  }
      
    if( ! preg_match( "#^[a-z0-9_.-]+$#i" , $file_new_name ) )
     {  return $this -> ERROR_TYPE = "FILE_ILLEGAL_NAME";  }
     
    if( file_exists( $file_new_name ) )
     {  return $this -> ERROR_TYPE = "FILE_EXISTS";  }

    @ chmod( $filename , $this -> mod_get_perms_as_integer( $perms ) );

    if( $file_new_name == $filename )
     {
      header( "Location: ?dir=" . $this -> TEMP_DIR ); 
      exit;
     } 

    @ rename( $filename , $file_new_name );
     
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }

  function mod_post_properties_dir( $dirname , $perms , $dir_new_name )  
   {
    $dirname = preg_replace( "#/+#" , "/" , $dirname );
    $dirname = preg_replace( "#(\.\.|\.)/#" , "" , $dirname );
    $dir_new_name = preg_replace( "#/+#" , "/" , $dir_new_name );
    $dir_new_name = preg_replace( "#(\.\.|\.)/#" , "" , $dir_new_name );
    
    if( ! opendir( $dirname ) )
     {  return $this -> ERROR_TYPE = "DIR_404";  }
      
    if( @ opendir( $dir_new_name ) )
     {  return $this -> ERROR_TYPE = "DIR_EXISTS";  }

    @ chmod( $dirname , $this -> mod_get_perms_as_integer( $perms ) );

    if( $dirname == $dir_new_name )
     {
      header( "Location: ?dir=" . $this -> TEMP_DIR ); 
      exit;
     } 

    @ rename( $this -> TEMP_DIR . $dirname , $this -> TEMP_DIR . $dir_new_name );
     
    header( "Location: ?dir=" . $this -> TEMP_DIR ); 
    exit;
   }
 }
  
?>

PM ICQ   Вверх
Vaulter
Дата 17.8.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



sim7, хех... для этой лабуды юзаю такую функцию:
Код

    function selectWhere($filename,$where=null,$rownum=null)
    {
        //open db
        if(!$this->tableExists($filename)) return null;
        
        $fp = fopen($this->workdir."/".$filename,"r");
        if(!$fp)
        {
            sys_log("Ошибка открытия на чтение файла $filename");
            return false;
        }
        $columns = explode(DELIM,fgets($fp,4048));
        
        if(!empty($where) && preg_match_all("/(\\w+) \\s?=\\s? (\"|')?  (.*?) (?(2)\\2) /x",$where, $match))
        {
            $conds = array();
            for($i =0; $i< count($match[0]); $i++)
                if(in_array($match[1][$i],$columns))
                    $conds[] = "\$item['".array_search($match[1][$i],$columns)."']=='".$match[3][$i]."'";
                
            $condition = implode(" && "/*TODO*/, $conds);
            
        }
        $line = 0;
        $lines = array();
        while($buff = fgets($fp,4048))
        {
            $found = false;
            $item = explode(DELIM,trim($buff));
            if(!empty($condition))
                eval("if($condition) \$found = true;");
            if(is_numeric($rownum) && $line == $rownum) $found = true;
            if($found) return $item;
            $line ++;
        }
        return false;
    }



--------------------
PM MAIL WWW ICQ   Вверх
Alone
Дата 17.8.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 11.5.2003
Где: Dnepropetrovsk, U A

Репутация: нет
Всего: 6



Mal Hack, 
Vaulter, 
Сразу видно, кто занимается разработкой, а кто "скриптовик-затейник" smile 
PS: И ничего личного...


--------------------
web developer/telecommunication specialist.
mailto: [email protected]
ICQ#28442924

PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 17.8.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(Alone @  17.8.2006,  17:18 Найти цитируемый пост)
Сразу видно, кто занимается разработкой, а кто "скриптовик-затейник" smile 

Ты к чему? smile
PM ICQ   Вверх
mr.Anderson
Дата 17.8.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Alone, может, лучше было сказать так: "Сразу видно, кто уже профессионал, а кто еще только учится!"  smile Как будто все специалистами сразу становятся!!! smile  smile 


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
jzZ
Дата 17.8.2006, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 17.7.2006

Репутация: нет
Всего: 2



sim7
лично мое мнение, класс неуневерсален, и вообще подгружать 18кило неохота когда можно обойтись 2мя 3мя для конкретной задачи, тем более что класс в духе php4.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0731 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.