123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605 |
- <?php
- /**
- * Hoa
- *
- *
- * @license
- *
- * New BSD License
- *
- * Copyright © 2007-2017, Hoa community. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the Hoa nor the names of its contributors may be
- * used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- namespace Hoa\File;
- use Hoa\Stream;
- /**
- * Class \Hoa\File\Generic.
- *
- * Describe a super-file.
- *
- * @copyright Copyright © 2007-2017 Hoa community
- * @license New BSD License
- */
- abstract class Generic
- extends Stream
- implements Stream\IStream\Pathable,
- Stream\IStream\Statable,
- Stream\IStream\Touchable
- {
- /**
- * Mode.
- *
- * @var string
- */
- protected $_mode = null;
- /**
- * Get filename component of path.
- *
- * @return string
- */
- public function getBasename()
- {
- return basename($this->getStreamName());
- }
- /**
- * Get directory name component of path.
- *
- * @return string
- */
- public function getDirname()
- {
- return dirname($this->getStreamName());
- }
- /**
- * Get size.
- *
- * @return int
- */
- public function getSize()
- {
- if (false === $this->getStatistic()) {
- return false;
- }
- return filesize($this->getStreamName());
- }
- /**
- * Get informations about a file.
- *
- * @return array
- */
- public function getStatistic()
- {
- return fstat($this->getStream());
- }
- /**
- * Get last access time of file.
- *
- * @return int
- */
- public function getATime()
- {
- return fileatime($this->getStreamName());
- }
- /**
- * Get inode change time of file.
- *
- * @return int
- */
- public function getCTime()
- {
- return filectime($this->getStreamName());
- }
- /**
- * Get file modification time.
- *
- * @return int
- */
- public function getMTime()
- {
- return filemtime($this->getStreamName());
- }
- /**
- * Get file group.
- *
- * @return int
- */
- public function getGroup()
- {
- return filegroup($this->getStreamName());
- }
- /**
- * Get file owner.
- *
- * @return int
- */
- public function getOwner()
- {
- return fileowner($this->getStreamName());
- }
- /**
- * Get file permissions.
- *
- * @return int
- */
- public function getPermissions()
- {
- return fileperms($this->getStreamName());
- }
- /**
- * Get file permissions as a string.
- * Result sould be interpreted like this:
- * * s: socket;
- * * l: symbolic link;
- * * -: regular;
- * * b: block special;
- * * d: directory;
- * * c: character special;
- * * p: FIFO pipe;
- * * u: unknown.
- *
- * @return string
- */
- public function getReadablePermissions()
- {
- $p = $this->getPermissions();
- if (($p & 0xC000) == 0xC000) {
- $out = 's';
- } elseif (($p & 0xA000) == 0xA000) {
- $out = 'l';
- } elseif (($p & 0x8000) == 0x8000) {
- $out = '-';
- } elseif (($p & 0x6000) == 0x6000) {
- $out = 'b';
- } elseif (($p & 0x4000) == 0x4000) {
- $out = 'd';
- } elseif (($p & 0x2000) == 0x2000) {
- $out = 'c';
- } elseif (($p & 0x1000) == 0x1000) {
- $out = 'p';
- } else {
- $out = 'u';
- }
- $out .=
- (($p & 0x0100) ? 'r' : '-') .
- (($p & 0x0080) ? 'w' : '-') .
- (($p & 0x0040) ?
- (($p & 0x0800) ? 's' : 'x') :
- (($p & 0x0800) ? 'S' : '-')) .
- (($p & 0x0020) ? 'r' : '-') .
- (($p & 0x0010) ? 'w' : '-') .
- (($p & 0x0008) ?
- (($p & 0x0400) ? 's' : 'x') :
- (($p & 0x0400) ? 'S' : '-')) .
- (($p & 0x0004) ? 'r' : '-') .
- (($p & 0x0002) ? 'w' : '-') .
- (($p & 0x0001) ?
- (($p & 0x0200) ? 't' : 'x') :
- (($p & 0x0200) ? 'T' : '-'));
- return $out;
- }
- /**
- * Check if the file is readable.
- *
- * @return bool
- */
- public function isReadable()
- {
- return is_readable($this->getStreamName());
- }
- /**
- * Check if the file is writable.
- *
- * @return bool
- */
- public function isWritable()
- {
- return is_writable($this->getStreamName());
- }
- /**
- * Check if the file is executable.
- *
- * @return bool
- */
- public function isExecutable()
- {
- return is_executable($this->getStreamName());
- }
- /**
- * Clear file status cache.
- *
- * @return void
- */
- public function clearStatisticCache()
- {
- clearstatcache(true, $this->getStreamName());
- return;
- }
- /**
- * Clear all files status cache.
- *
- * @return void
- */
- public static function clearAllStatisticCaches()
- {
- clearstatcache();
- return;
- }
- /**
- * Set access and modification time of file.
- *
- * @param int $time Time. If equals to -1, time() should be used.
- * @param int $atime Access time. If equals to -1, $time should be
- * used.
- * @return bool
- */
- public function touch($time = -1, $atime = -1)
- {
- if ($time == -1) {
- $time = time();
- }
- if ($atime == -1) {
- $atime = $time;
- }
- return touch($this->getStreamName(), $time, $atime);
- }
- /**
- * Copy file.
- * Return the destination file path if succeed, false otherwise.
- *
- * @param string $to Destination path.
- * @param bool $force Force to copy if the file $to already exists.
- * Use the \Hoa\Stream\IStream\Touchable::*OVERWRITE
- * constants.
- * @return bool
- */
- public function copy($to, $force = Stream\IStream\Touchable::DO_NOT_OVERWRITE)
- {
- $from = $this->getStreamName();
- if ($force === Stream\IStream\Touchable::DO_NOT_OVERWRITE &&
- true === file_exists($to)) {
- return true;
- }
- if (null === $this->getStreamContext()) {
- return @copy($from, $to);
- }
- return @copy($from, $to, $this->getStreamContext()->getContext());
- }
- /**
- * Move a file.
- *
- * @param string $name New name.
- * @param bool $force Force to move if the file $name already
- * exists.
- * Use the \Hoa\Stream\IStream\Touchable::*OVERWRITE
- * constants.
- * @param bool $mkdir Force to make directory if does not exist.
- * Use the \Hoa\Stream\IStream\Touchable::*DIRECTORY
- * constants.
- * @return bool
- */
- public function move(
- $name,
- $force = Stream\IStream\Touchable::DO_NOT_OVERWRITE,
- $mkdir = Stream\IStream\Touchable::DO_NOT_MAKE_DIRECTORY
- ) {
- $from = $this->getStreamName();
- if ($force === Stream\IStream\Touchable::DO_NOT_OVERWRITE &&
- true === file_exists($name)) {
- return false;
- }
- if (Stream\IStream\Touchable::MAKE_DIRECTORY === $mkdir) {
- Directory::create(
- dirname($name),
- Directory::MODE_CREATE_RECURSIVE
- );
- }
- if (null === $this->getStreamContext()) {
- return @rename($from, $name);
- }
- return @rename($from, $name, $this->getStreamContext()->getContext());
- }
- /**
- * Delete a file.
- *
- * @return bool
- */
- public function delete()
- {
- if (null === $this->getStreamContext()) {
- return @unlink($this->getStreamName());
- }
- return @unlink(
- $this->getStreamName(),
- $this->getStreamContext()->getContext()
- );
- }
- /**
- * Change file group.
- *
- * @param mixed $group Group name or number.
- * @return bool
- */
- public function changeGroup($group)
- {
- return chgrp($this->getStreamName(), $group);
- }
- /**
- * Change file mode.
- *
- * @param int $mode Mode (in octal!).
- * @return bool
- */
- public function changeMode($mode)
- {
- return chmod($this->getStreamName(), $mode);
- }
- /**
- * Change file owner.
- *
- * @param mixed $user User.
- * @return bool
- */
- public function changeOwner($user)
- {
- return chown($this->getStreamName(), $user);
- }
- /**
- * Change the current umask.
- *
- * @param int $umask Umask (in octal!). If null, given the current
- * umask value.
- * @return int
- */
- public static function umask($umask = null)
- {
- if (null === $umask) {
- return umask();
- }
- return umask($umask);
- }
- /**
- * Check if it is a file.
- *
- * @return bool
- */
- public function isFile()
- {
- return is_file($this->getStreamName());
- }
- /**
- * Check if it is a link.
- *
- * @return bool
- */
- public function isLink()
- {
- return is_link($this->getStreamName());
- }
- /**
- * Check if it is a directory.
- *
- * @return bool
- */
- public function isDirectory()
- {
- return is_dir($this->getStreamName());
- }
- /**
- * Check if it is a socket.
- *
- * @return bool
- */
- public function isSocket()
- {
- return filetype($this->getStreamName()) == 'socket';
- }
- /**
- * Check if it is a FIFO pipe.
- *
- * @return bool
- */
- public function isFIFOPipe()
- {
- return filetype($this->getStreamName()) == 'fifo';
- }
- /**
- * Check if it is character special file.
- *
- * @return bool
- */
- public function isCharacterSpecial()
- {
- return filetype($this->getStreamName()) == 'char';
- }
- /**
- * Check if it is block special.
- *
- * @return bool
- */
- public function isBlockSpecial()
- {
- return filetype($this->getStreamName()) == 'block';
- }
- /**
- * Check if it is an unknown type.
- *
- * @return bool
- */
- public function isUnknown()
- {
- return filetype($this->getStreamName()) == 'unknown';
- }
- /**
- * Set the open mode.
- *
- * @param string $mode Open mode. Please, see the child::MODE_*
- * constants.
- * @return string
- */
- protected function setMode($mode)
- {
- $old = $this->_mode;
- $this->_mode = $mode;
- return $old;
- }
- /**
- * Get the open mode.
- *
- * @return string
- */
- public function getMode()
- {
- return $this->_mode;
- }
- /**
- * Get inode.
- *
- * @return int
- */
- public function getINode()
- {
- return fileinode($this->getStreamName());
- }
- /**
- * Check if the system is case sensitive or not.
- *
- * @return bool
- */
- public static function isCaseSensitive()
- {
- return !(
- file_exists(mb_strtolower(__FILE__)) &&
- file_exists(mb_strtoupper(__FILE__))
- );
- }
- /**
- * Get a canonicalized absolute pathname.
- *
- * @return string
- */
- public function getRealPath()
- {
- if (false === $out = realpath($this->getStreamName())) {
- return $this->getStreamName();
- }
- return $out;
- }
- /**
- * Get file extension (if exists).
- *
- * @return string
- */
- public function getExtension()
- {
- return pathinfo(
- $this->getStreamName(),
- PATHINFO_EXTENSION
- );
- }
- /**
- * Get filename without extension.
- *
- * @return string
- */
- public function getFilename()
- {
- $file = basename($this->getStreamName());
- if (defined('PATHINFO_FILENAME')) {
- return pathinfo($file, PATHINFO_FILENAME);
- }
- if (strstr($file, '.')) {
- return substr($file, 0, strrpos($file, '.'));
- }
- return $file;
- }
- }
|