За последние 24 часа нас посетили 17543 программиста и 1602 робота. Сейчас ищут 988 программистов ...

Оболочка для простых операций с файлами

Тема в разделе "Решения, алгоритмы", создана пользователем Apple, 18 июн 2009.

  1. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Собственно, в каёй-то теме давно я упоминал, что делал работу с файлами на подобии той, которая есть в С#.
    А именно там есть пространство имен System.IO в котором есть статический класс File, осуществляющий простейшие операции.
    Мне очень-очень нужны были три метода: Exists, Create, Delete, в результате был написан простейший класс, реализующий данный функционал.
    Написан он не сегодня, работает также на РНР 4, реализует основной необходимый функционал по работе с файлами.
    Впрочем, вот:

    PHP:
    1. <?php
    2.  
    3. class File
    4. {
    5.     /**
    6.      * Проверка на существование файла
    7.      *
    8.      * @param  string $filename
    9.      * Имя файла, существование которого нужно проверить
    10.      *
    11.      * @return bool
    12.      * Возвращает true, если файл существует, иначе - false
    13.      **/
    14.     static function Exists($filename)
    15.     {
    16.         if(strlen($filename) && is_string($filename)) {
    17.             clearstatcache();
    18.            
    19.             return is_file($filename);
    20.         }else{
    21.             trigger_error("Filename must be a string", E_USER_WARNING);
    22.         }
    23.     }
    24.    
    25.     /**
    26.      * Удаление файла
    27.      *
    28.      * @param  string $filename
    29.      * Имя файла, который следует удалить
    30.      *
    31.      * @return bool
    32.      * В зависимости от результата вернет true/false
    33.      */
    34.     static function Delete($filename)
    35.     {
    36.         if(self::Exists($filename) && is_writable($filename)) {
    37.             if(@unlink($filename)):
    38.                 return true;
    39.             else:
    40.                 return false;
    41.             endif;
    42.         }
    43.        
    44.         return false;
    45.     }
    46.    
    47.     /**
    48.      * Создание файла
    49.      *
    50.      * @param  string $filename
    51.      * Имя файла, который будет создан
    52.      * @param  octal  $chmod
    53.      * Права, которые устанавливаются на
    54.      * файл по-умолчанию
    55.      *
    56.      * @return bool
    57.      * В зависимости от результата вернет true/false
    58.      */
    59.     static function Create($filename, $chmod = 0666)
    60.     {
    61.         if(self::Exists($filename)) {
    62.             trigger_error("File already exists", E_USER_WARNING);
    63.            
    64.             return false;
    65.         }
    66.        
    67.         if(($handle = @fopen($filename, "w"))) {
    68.             fclose($handle);
    69.             if(!(@chmod($filename, $chmod))) {
    70.                 trigger_error("Cannot change file permissions", E_USER_NOTICE);
    71.             }
    72.            
    73.             return true;
    74.         }else{
    75.             trigger_error("Cannot create a file", E_USER_WARNING);
    76.            
    77.             return false;
    78.         }
    79.     }
    80.    
    81.     /**
    82.      * Заполнить файл
    83.      *
    84.      * @param  string $filename
    85.      * Имя файла
    86.      * @param  int   $bytes
    87.      * Сколько будет залито
    88.      * @param  char  $char
    89.      * Каким символом будет залит-файл.
    90.      * @param  int   $timeout
    91.      * Установка лимита на исполнение скрипта
    92.      *
    93.      * @return bool
    94.      * В зависимости от результата вернет true/false
    95.      */
    96.     static function Fill($filename, $bytes, $char = "\0", $timeout = 0)
    97.     {
    98.         set_time_limit($timeout);
    99.        
    100.         if(($handle = fopen($filename, 'a'))) {
    101.             while($bytes) {
    102.                 fwrite($handle, $char, $bytes);
    103.                 $bytes--;
    104.             }
    105.             @fclose($handle);
    106.            
    107.             return true;
    108.         }
    109.        
    110.         return false;      
    111.     }
    112.    
    113.     /**
    114.      * Очищает заданный файл
    115.      *
    116.      * @param  string $filename
    117.      * Имя файла
    118.      *
    119.      * @return bool
    120.      * В зависимости от результата вернет true/false
    121.      */
    122.     static function Clean($filename)
    123.     {
    124.         if(self::Exists($filename)) {
    125.             self::Delete($filename);
    126.             self::Create($filename);
    127.            
    128.             return true;
    129.         }else{
    130.             trigger_error("File does not exists", E_USER_NOTICE);
    131.            
    132.             return false;
    133.         }
    134.     }
    135. };
    136.  
    137. ?>
    Ничего лишнего, дополнять я его уже ничем не буду.
    До сих пор используется в одном из проектов.
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Примеры использования:

    Создаем на Windows файл только для чтения, заполняем и удаляем:
    PHP:
    1. <?
    2. File::Create("something.xml", 0444);
    3.  
    4. if(File::Exists("something.xml")) {
    5.     File::Fill("something.xml"); // Ошибка, файл только для чтения
    6.     File::Delete("something.xml"); // Хе-хе
    7. }
    8.  
    9. File::Create("abc");
    10. File::Fill("abc", 1024*256);
    11. File::Delete("abc");
    12.  
    13. ?>
    Думаю кому-нибудь, да полезен будет :)
    Работа очень прозрачная.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    PHP:
    1.  
    2. <?
    3. // а что если
    4.               if(file_exists($filename)):
    5.                   return true;
    6.               else:
    7.                   return false;
    8.               endif;
    9.  
    10. // заменить на
    11. return file_exists($filename);
    12. // ?
    13.  
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ммм, мне это нравится =)
    Сенк, подправил.
     
  5. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    это уже даже не велосипед, это изобретение тарелки :)
    где flock($open_file, LOCK_EX); ?
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    кстати, жрать-то как хочется!

    p.s. зачетный класс. мило. phpdoc съест. что по сути обертка для стандартных функций, так оно и хорошо.
     
  7. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Было чертовски удобно это использовать, как не говори.

    А flock не нужен, класс писался исключительно под требования и в этих требованиях никак не предусматривалось управление записью вообще.
    Я же написал — Exists, Delete, Create — основная задача класса.
    Это было добавлено потом добавлено, чтобы зарезервировать место.

    Кстати, тарелка это или чего-то ещё, это офигенно удобно.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?
    2. if(@unlink($filename)):
    3.   return true;
    4. else:
    5.   return false;
    6. endif;
    7.  
    8. // Такие вещи очень красиво записываются:
    9. return !!(@unlink($filename));
    10.  
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    TheShock
    Хоть класс и не первой свежести, но мне всё не перепривыкнуть писать иначе.
    Привычка - вещь тяжелая ...
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    0o
    return @unlink($filename);
    http://www.php.ru/manual/function.file-exists.html
    нужно is_file
     
  11. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Кхм ... где, куда, зачем? :)
    На проверку удаления файла?

    Надо будет посидеть, посмотреть, чего не достает в классе и переписать под РНР 5 с учетом flock и прочего.
    Но мне он очень-очень удобен и отказываться его использовать ради нэйтивных функций не охота =)
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    точно. оно возвращает булево :)
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Mr.M.I.T.
    А, всё, понял.
    Спасибо.