Собственно, в каёй-то теме давно я упоминал, что делал работу с файлами на подобии той, которая есть в С#. А именно там есть пространство имен System.IO в котором есть статический класс File, осуществляющий простейшие операции. Мне очень-очень нужны были три метода: Exists, Create, Delete, в результате был написан простейший класс, реализующий данный функционал. Написан он не сегодня, работает также на РНР 4, реализует основной необходимый функционал по работе с файлами. Впрочем, вот: PHP: <?php class File { /** * Проверка на существование файла * * @param string $filename * Имя файла, существование которого нужно проверить * * @return bool * Возвращает true, если файл существует, иначе - false **/ static function Exists($filename) { if(strlen($filename) && is_string($filename)) { clearstatcache(); return is_file($filename); }else{ trigger_error("Filename must be a string", E_USER_WARNING); } } /** * Удаление файла * * @param string $filename * Имя файла, который следует удалить * * @return bool * В зависимости от результата вернет true/false */ static function Delete($filename) { if(self::Exists($filename) && is_writable($filename)) { if(@unlink($filename)): return true; else: return false; endif; } return false; } /** * Создание файла * * @param string $filename * Имя файла, который будет создан * @param octal $chmod * Права, которые устанавливаются на * файл по-умолчанию * * @return bool * В зависимости от результата вернет true/false */ static function Create($filename, $chmod = 0666) { if(self::Exists($filename)) { trigger_error("File already exists", E_USER_WARNING); return false; } if(($handle = @fopen($filename, "w"))) { fclose($handle); if(!(@chmod($filename, $chmod))) { trigger_error("Cannot change file permissions", E_USER_NOTICE); } return true; }else{ trigger_error("Cannot create a file", E_USER_WARNING); return false; } } /** * Заполнить файл * * @param string $filename * Имя файла * @param int $bytes * Сколько будет залито * @param char $char * Каким символом будет залит-файл. * @param int $timeout * Установка лимита на исполнение скрипта * * @return bool * В зависимости от результата вернет true/false */ static function Fill($filename, $bytes, $char = "\0", $timeout = 0) { set_time_limit($timeout); if(($handle = fopen($filename, 'a'))) { while($bytes) { fwrite($handle, $char, $bytes); $bytes--; } @fclose($handle); return true; } return false; } /** * Очищает заданный файл * * @param string $filename * Имя файла * * @return bool * В зависимости от результата вернет true/false */ static function Clean($filename) { if(self::Exists($filename)) { self::Delete($filename); self::Create($filename); return true; }else{ trigger_error("File does not exists", E_USER_NOTICE); return false; } } }; ?> Ничего лишнего, дополнять я его уже ничем не буду. До сих пор используется в одном из проектов.
Примеры использования: Создаем на Windows файл только для чтения, заполняем и удаляем: PHP: <? File::Create("something.xml", 0444); if(File::Exists("something.xml")) { File::Fill("something.xml"); // Ошибка, файл только для чтения File::Delete("something.xml"); // Хе-хе } File::Create("abc"); File::Fill("abc", 1024*256); File::Delete("abc"); ?> Думаю кому-нибудь, да полезен будет Работа очень прозрачная.
PHP: <? // а что если if(file_exists($filename)): return true; else: return false; endif; // заменить на return file_exists($filename); // ?
кстати, жрать-то как хочется! p.s. зачетный класс. мило. phpdoc съест. что по сути обертка для стандартных функций, так оно и хорошо.
Было чертовски удобно это использовать, как не говори. А flock не нужен, класс писался исключительно под требования и в этих требованиях никак не предусматривалось управление записью вообще. Я же написал — Exists, Delete, Create — основная задача класса. Это было добавлено потом добавлено, чтобы зарезервировать место. Кстати, тарелка это или чего-то ещё, это офигенно удобно.
PHP: <? if(@unlink($filename)): return true; else: return false; endif; // Такие вещи очень красиво записываются: return !!(@unlink($filename));
TheShock Хоть класс и не первой свежести, но мне всё не перепривыкнуть писать иначе. Привычка - вещь тяжелая ...
Кхм ... где, куда, зачем? На проверку удаления файла? Надо будет посидеть, посмотреть, чего не достает в классе и переписать под РНР 5 с учетом flock и прочего. Но мне он очень-очень удобен и отказываться его использовать ради нэйтивных функций не охота =)