Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: *//*** File** PHP versions 4 and 5** LICENSE: This source file is subject to version 3.0 of the PHP license* that is available through the world-wide-web at the following URI:* http://www.php.net/license/3_0.txt. If you did not receive a copy of* the PHP License and are unable to obtain it through the web, please* send a note to license@php.net so we can mail you a copy immediately.** @category File* @package File* @author Richard Heyes <richard@php.net>* @author Tal Peer <tal@php.net>* @author Michael Wallner <mike@php.net>* @copyright 2002-2005 The Authors* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version CVS: $Id: File.php,v 1.38 2007/03/24 16:38:56 dufuz Exp $* @link http://pear.php.net/package/File*//*** Requires PEAR*/require_once 'PEAR.php';/*** The default number of bytes for reading*/if (!defined('FILE_DEFAULT_READSIZE')) {define('FILE_DEFAULT_READSIZE', 1024, true);}/*** The maximum number of bytes for reading lines*/if (!defined('FILE_MAX_LINE_READSIZE')) {define('FILE_MAX_LINE_READSIZE', 40960, true);}/*** Whether file locks should block*/if (!defined('FILE_LOCKS_BLOCK')) {define('FILE_LOCKS_BLOCK', true, true);}/*** Mode to use for reading from files*/define('FILE_MODE_READ', 'rb', true);/*** Mode to use for truncating files, then writing*/define('FILE_MODE_WRITE', 'wb', true);/*** Mode to use for appending to files*/define('FILE_MODE_APPEND', 'ab', true);/*** Use this when a shared (read) lock is required*/define('FILE_LOCK_SHARED', LOCK_SH | (FILE_LOCKS_BLOCK ? 0 : LOCK_NB), true);/*** Use this when an exclusive (write) lock is required*/define('FILE_LOCK_EXCLUSIVE', LOCK_EX | (FILE_LOCKS_BLOCK ? 0 : LOCK_NB), true);/*** Class for handling files** A class with common functions for writing,* reading and handling files and directories** @author Richard Heyes <richard@php.net>* @author Tal Peer <tal@php.net>* @author Michael Wallner <mike@php.net>* @access public* @package File** @static*/class File extends PEAR{/*** Destructor** Unlocks any locked file pointers and closes all filepointers** @access private*/function _File(){File::closeAll();}/*** Handles file pointers. If a file pointer needs to be opened,* it will be. If it already exists (based on filename and mode)* then the existing one will be returned.** @access private* @param string $filename Filename to be used* @param string $mode Mode to open the file in* @param mixed $lock Type of lock to use* @return mixed PEAR_Error on error or file pointer resource on success*/function _getFilePointer($filename, $mode, $lock = false){$filePointers = &PEAR::getStaticProperty('File', 'filePointers');// Win32 is case-insensitiveif (OS_WINDOWS) {$filename = strtolower($filename);}// check if file pointer already existsif (!isset($filePointers[$filename][$mode]) ||!is_resource($filePointers[$filename][$mode])) {// check if we can open the file in the desired modeswitch ($mode){case FILE_MODE_READ:if (!preg_match('/^.+(?<!file):\/\//i', $filename) &&!file_exists($filename)) {return PEAR::raiseError("File does not exist: $filename");}break;case FILE_MODE_APPEND:case FILE_MODE_WRITE:if (file_exists($filename)) {if (!is_writable($filename)) {return PEAR::raiseError("File is not writable: $filename");}} elseif (!is_writable($dir = dirname($filename))) {return PEAR::raiseError("Cannot create file in directory: $dir");}break;default:return PEAR::raiseError("Invalid access mode: $mode");}// open file$filePointers[$filename][$mode] = @fopen($filename, $mode);if (!is_resource($filePointers[$filename][$mode])) {return PEAR::raiseError('Failed to open file: ' . $filename);}}// lock fileif ($lock) {$lock = $mode == FILE_MODE_READ ? FILE_LOCK_SHARED : FILE_LOCK_EXCLUSIVE;$locks = &PEAR::getStaticProperty('File', 'locks');if (@flock($filePointers[$filename][$mode], $lock)) {$locks[] = &$filePointers[$filename][$mode];} elseif (FILE_LOCKS_BLOCK) {return PEAR::raiseError("File already locked: $filename");} else {return PEAR::raiseError("Could not lock file: $filename");}}return $filePointers[$filename][$mode];}/*** Reads an entire file and returns it.* Uses file_get_contents if available.** @access public* @param string $filename Name of file to read from* @param mixed $lock Type of lock to use* @return mixed PEAR_Error if an error has occured or a string with the contents of the the file*/function readAll($filename, $lock = false){if (false === $file = @file_get_contents($filename)) {return PEAR::raiseError("Cannot read file: $filename");}return $file;}/*** Returns a specified number of bytes of a file.* Defaults to FILE_DEFAULT_READSIZE. If $size is 0, all file will be read.** @access public* @param string $filename Name of file to read from* @param integer $size Bytes to read* @param mixed $lock Type of lock to use* @return mixed PEAR_Error on error or a string which contains the data read* Will also return false upon EOF*/function read($filename, $size = FILE_DEFAULT_READSIZE, $lock = false){static $filePointers;if ($size == 0) {return File::readAll($filename, $lock);}if (!isset($filePointers[$filename]) ||!is_resource($filePointers[$filename])) {$fp = File::_getFilePointer($filename, FILE_MODE_READ, $lock);if (PEAR::isError($fp)) {return $fp;}$filePointers[$filename] = $fp;} else {$fp = $filePointers[$filename];}return !feof($fp) ? fread($fp, $size) : false;}/*** Writes the given data to the given filename.* Defaults to no lock, append mode.** @access public* @param string $filename Name of file to write to* @param string $data Data to write to file* @param string $mode Mode to open file in* @param mixed $lock Type of lock to use* @return mixed PEAR_Error on error or number of bytes written to file.*/function write($filename, $data, $mode = FILE_MODE_APPEND, $lock = false){$fp = File::_getFilePointer($filename, $mode, $lock);if (PEAR::isError($fp)) {return $fp;}if (false === $bytes = @fwrite($fp, $data, strlen($data))) {return PEAR::raiseError("Cannot write data: '$data' to file: '$filename'");}return $bytes;}/*** Reads and returns a single character from given filename** @access public* @param string $filename Name of file to read from* @param mixed $lock Type of lock to use* @return mixed PEAR_Error on error or one character of the specified file*/function readChar($filename, $lock = false){return File::read($filename, 1, $lock);}/*** Writes a single character to a file** @access public* @param string $filename Name of file to write to* @param string $char Character to write* @param string $mode Mode to use when writing* @param mixed $lock Type of lock to use* @return mixed PEAR_Error on error, or 1 on success*/function writeChar($filename, $char, $mode = FILE_MODE_APPEND, $lock = false){$fp = File::_getFilePointer($filename, $mode, $lock);if (PEAR::isError($fp)) {return $fp;}if (false === @fwrite($fp, $char, 1)) {return PEAR::raiseError("Cannot write data: '$data' to file: '$filename'");}return 1;}/*** Returns a line of the file (without trailing CRLF).* Maximum read line length is FILE_MAX_LINE_READSIZE.** @access public* @param string $filename Name of file to read from* @param boolean $lock Whether file should be locked* @return mixed PEAR_Error on error or a string containing the line read from file*/function readLine($filename, $lock = false){static $filePointers; // Used to prevent unnecessary calls to _getFilePointer()if (!isset($filePointers[$filename]) ||!is_resource($filePointers[$filename])) {$fp = File::_getFilePointer($filename, FILE_MODE_READ, $lock);if (PEAR::isError($fp)) {return $fp;}$filePointers[$filename] = $fp;} else {$fp = $filePointers[$filename];}if (feof($fp)) {return false;}return rtrim(fgets($fp, FILE_MAX_LINE_READSIZE), "\r\n");}/*** Writes a single line, appending a LF (by default)** @access public* @param string $filename Name of file to write to* @param string $line Line of data to be written to file* @param string $mode Write mode, can be either FILE_MODE_WRITE or FILE_MODE_APPEND* @param string $crlf The CRLF your system is using. UNIX = \n Windows = \r\n Mac = \r* @param mixed $lock Whether to lock the file* @return mixed PEAR_Error on error or number of bytes written to file (including appended crlf)*/function writeLine($filename, $line, $mode = FILE_MODE_APPEND, $crlf = "\n", $lock = false){$fp = File::_getFilePointer($filename, $mode, $lock);if (PEAR::isError($fp)) {return $fp;}if (false === $bytes = fwrite($fp, $line . $crlf)) {return PEAR::raiseError("Cannot write data: '$data' to file: '$file'");}return $bytes;}/*** This rewinds a filepointer to the start of a file** @access public* @param string $filename The filename* @param string $mode Mode the file was opened in* @return mixed PEAR Error on error, true on success*/function rewind($filename, $mode){$fp = File::_getFilePointer($filename, $mode);if (PEAR::isError($fp)) {return $fp;}if (!@rewind($fp)) {return PEAR::raiseError("Cannot rewind file: $filename");}return true;}/*** Closes all open file pointers** @access public* @return void*/function closeAll(){$locks = &PEAR::getStaticProperty('File', 'locks');$filePointers = &PEAR::getStaticProperty('File', 'filePointers');// unlock filesfor ($i = 0, $c = count($locks); $i < $c; $i++) {is_resource($locks[$i]) and @flock($locks[$i], LOCK_UN);}// close filesif (!empty($filePointers)) {foreach ($filePointers as $fname => $modes) {foreach (array_keys($modes) as $mode) {if (is_resource($filePointers[$fname][$mode])) {@fclose($filePointers[$fname][$mode]);}unset($filePointers[$fname][$mode]);}}}}/*** This closes an open file pointer** @access public* @param string $filename The filename that was opened* @param string $mode Mode the file was opened in* @return mixed PEAR Error on error, true otherwise*/function close($filename, $mode){$filePointers = &PEAR::getStaticProperty('File', 'filePointers');if (OS_WINDOWS) {$filename = strToLower($filename);}if (!isset($filePointers[$filename][$mode])) {return true;}$fp = $filePointers[$filename][$mode];unset($filePointers[$filename][$mode]);if (is_resource($fp)) {// unlock file@flock($fp, LOCK_UN);// close fileif (!@fclose($fp)) {return PEAR::raiseError("Cannot close file: $filename");}}return true;}/*** This unlocks a locked file pointer.** @access public* @param string $filename The filename that was opened* @param string $mode Mode the file was opened in* @return mixed PEAR Error on error, true otherwise*/function unlock($filename, $mode){$fp = File::_getFilePointer($filename, $mode);if (PEAR::isError($fp)) {return $fp;}if (!@flock($fp, LOCK_UN)) {return PEAR::raiseError("Cacnnot unlock file: $filename");}return true;}/*** @deprecated*/function stripTrailingSeparators($path, $separator = DIRECTORY_SEPARATOR){if ($path === $separator) {return $path;}return rtrim($path, $separator);}/*** @deprecated*/function stripLeadingSeparators($path, $separator = DIRECTORY_SEPARATOR){if ($path === $separator) {return $path;}return ltrim($path, $separator);}/*** @deprecated Use File_Util::buildPath() instead.*/function buildPath($parts, $separator = DIRECTORY_SEPARATOR){require_once 'File/Util.php';return File_Util::buildPath($parts, $separator);}/*** @deprecated Use File_Util::skipRoot() instead.*/function skipRoot($path){require_once 'File/Util.php';return File_Util::skipRoot($path);}/*** @deprecated Use File_Util::tmpDir() instead.*/function getTempDir(){require_once 'File/Util.php';return File_Util::tmpDir();}/*** @deprecated Use File_Util::tmpFile() instead.*/function getTempFile($dirname = null){require_once 'File/Util.php';return File_Util::tmpFile($dirname);}/*** @deprecated Use File_Util::isAbsolute() instead.*/function isAbsolute($path){require_once 'File/Util.php';return File_Util::isAbsolute($path);}/*** @deprecated Use File_Util::relativePath() instead.*/function relativePath($path, $root, $separator = DIRECTORY_SEPARATOR){require_once 'File/Util.php';return File_Util::relativePath($path, $root, $separator);}/*** @deprecated Use File_Util::realpath() instead.*/function realpath($path, $separator = DIRECTORY_SEPARATOR){require_once 'File/Util.php';return File_Util::realpath($path, $separator);}}PEAR::registerShutdownFunc(array('File', '_File'));?>