X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=inc%2Fclasses%2Fmain%2Fio%2Fclass_FrameworkDirectoryPointer.php;h=da220403458c081e6531ca4f7cc5a0b937c3efd5;hb=3823de7144fa4f53fd520520f1ce51f1d12c2af8;hp=ba9b58c24945b44cb914d2a5cd55c45e94ebc336;hpb=178bf871182d5e4b5f02378674a0f9504db555c8;p=core.git diff --git a/inc/classes/main/io/class_FrameworkDirectoryPointer.php b/inc/classes/main/io/class_FrameworkDirectoryPointer.php index ba9b58c2..da220403 100644 --- a/inc/classes/main/io/class_FrameworkDirectoryPointer.php +++ b/inc/classes/main/io/class_FrameworkDirectoryPointer.php @@ -1,12 +1,12 @@ + * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 Core Developer Team * @license GNU GPL 3.0 or any newer version - * @link http://www.ship-simu.org + * @link http://www.shipsimu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,9 +28,9 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { private $pathName = ''; /** - * The directory pointer + * The directory iterator instance */ - private $dirPointer = NULL; + private $directoryInstance = NULL; /** * Protected constructor @@ -45,10 +45,10 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { */ public function __destruct() { // Is there a resource pointer? Then we have to close the directory here! - if (is_resource($this->getPointer())) { + if ($this->getDirectoryInstance() instanceof DirectoryIterator) { // Try to close a directory $this->closeDirectory(); - } + } // END - if // Call the parent destructor parent::__destruct(); @@ -59,36 +59,29 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { * be verified here. * * @param $pathName The path name we shall pass to opendir() - * @param $inConstructor If we are in de/con-structor or from somewhere - * else - * @return $pointerInstance A prepared instance of - * FrameworkDirectoryPointer - * @throws PathIsEmptyException If the provided path name - * is empty - * @throws InvalidPathStringException If the provided path name is - * not a string - * @throws PathIsNoDirectoryException If the provided path name is - * not valid - * @throws PathReadProtectedException If the provided path name is - * read-protected - * @throws DirPointerNotOpened If opendir() returns not a - * directory resource + * @param $inConstructor If we are in de/con-structor or from somewhere else + * @return $pointerInstance A prepared instance of FrameworkDirectoryPointer + * @throws PathIsEmptyException If the provided path name is empty + * @throws InvalidPathStringException If the provided path name is not a string + * @throws PathIsNoDirectoryException If the provided path name is not valid + * @throws PathReadProtectedException If the provided path name is read-protected + * @todo Get rid of inConstructor, could be old-lost code. */ - public static final function createFrameworkDirectoryPointer ($pathName, $inConstructor = false) { + public static final function createFrameworkDirectoryPointer ($pathName, $inConstructor = FALSE) { // Some pre-sanity checks... if (is_null($pathName)) { // No pathname given if ($inConstructor) { return NULL; } else { - throw new PathIsEmptyException(null, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + throw new PathIsEmptyException(NULL, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); } } elseif (!is_string($pathName)) { // Is not a string if ($inConstructor) { return NULL; } else { - throw new InvalidPathStringException(null, self::EXCEPTION_INVALID_STRING); + throw new InvalidPathStringException(NULL, self::EXCEPTION_INVALID_STRING); } } elseif (!is_dir($pathName)) { // Not a directory @@ -106,22 +99,14 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { } } - // Try to open a handler - $dirPointer = @opendir($pathName); - if (!is_resource($dirPointer)) { - // Something bad happend - if ($inConstructor) { - return NULL; - } else { - throw new DirPointerNotOpenedException($pathName, self::EXCEPTION_DIR_POINTER_INVALID); - } - } + // Get an iterator for the directory + $directoryInstance = new DirectoryIterator($pathName); // Create new instance $pointerInstance = new FrameworkDirectoryPointer(); // Set directory pointer and path name - $pointerInstance->setPointer($dirPointer); + $pointerInstance->setDirectoryInstance($directoryInstance); $pointerInstance->setPathName($pathName); // Return the instance @@ -131,45 +116,59 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { /** * Read raw lines of data from a directory pointer and return the data * - * @return string Directory and/or file names read from the current - * directory pointer + * @return $current Current entry from encapsulated iterator */ public function readRawDirectory () { - // Read data from the directory pointer and return it - return readdir($this->getPointer()); + // Can the next entry be read? + assert($this->getDirectoryInstance()->valid()); + + // Default is FALSE + $current = FALSE; + + // Is it a dot directory? + if (!$this->getDirectoryInstance()->isDot()) { + // Read data from the directory pointer and return it + $current = $this->getDirectoryInstance()->current(); + } // END - if + + // Advance to next entry + $this->getDirectoryInstance()->next(); + + // Return found entry + return $current; } /** * Read lines from the current directory pointer except some parts * - * @param $except Some parts of a directory we want to ignore. - * Valid: dirs - * Other values will be silently ignored - * @return string Directory and/or file names read from the current - * directory pointer + * @param $except Some parts of a directory we want to ignore. Valid: directory and file names, other values will be silently ignored + * @return string Directory and/or file names read from the current directory pointer */ public function readDirectoryExcept (array $except = array()) { + // No exceptions given? if (count($except) == 0) { - // No exception given, so read all data + // No exception given, so read all files and directories, but not recursive + self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: No exceptions given, please use readRawDirectory() instead!'); return $this->readRawDirectory(); } // END - if // Read a raw line... $rawLine = $this->readRawDirectory(); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine); // Shall we exclude directories? - if ((!is_null($rawLine)) && ($rawLine !== false) && (!in_array($rawLine, $except))) { + if ((!is_null($rawLine)) && ($rawLine !== FALSE) && (!in_array($rawLine, $except))) { // Return read data - //* NOISY-DEBUG: */ $this->debugOutput('DIRECTORY: rawLine[' . gettype($rawLine) . ']=' . $rawLine); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine); return $rawLine; - } elseif ((!is_null($rawLine)) && ($rawLine !== false)) { + } elseif ((!is_null($rawLine)) && ($rawLine !== FALSE)) { // Exclude this part - //* NOISY-DEBUG: */ $this->debugOutput('DIRECTORY: rawline[' . gettype($rawLine) . ']=' . $rawLine . ' - Recursive call!'); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawline[' . gettype($rawLine) . ']=' . $rawLine . ' - Recursive call!'); return $this->readDirectoryExcept($except); } // End pointer reached - //* NOISY-DEBUG: */ $this->debugOutput('DIRECTORY: Returning NULL!'); + //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: Returning NULL!'); return NULL; } @@ -180,43 +179,35 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { * @return void */ public function closeDirectory () { - // Close the directory pointer and reset the instance variable - @closedir($this->getPointer()); - $this->setPointer(NULL); + // Close the directory by unsetting it + $this->setDirectoryInstance(NULL); $this->setPathName(''); } /** * Setter for the directory pointer * - * @param $dirPointer The directory resource + * @param $directoryInstance An instanceof a DirectoryIterator class or NULL to unset ("close") it. * @return void */ - public final function setPointer ($dirPointer) { - // Sanity-check if pointer is a valid directory resource - if (is_resource($dirPointer) || is_null($dirPointer)) { - // Is a valid resource - $this->dirPointer = $dirPointer; - } else { - // Throw exception - throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE); - } + protected final function setDirectoryInstance (DirectoryIterator $directoryInstance = NULL) { + // Set instance (or NULL) + $this->directoryInstance = $directoryInstance; } /** * Getter for the directory pointer * - * @return $dirPointer The directory pointer which shall be a valid - * directory resource + * @return $directoryInstance The directory pointer which shall be a valid directory resource */ - public final function getPointer () { - return $this->dirPointer; + public final function getDirectoryInstance () { + return $this->directoryInstance; } /** * Setter for path name * - * @param $pathName The new path name + * @param $pathName The new path name * @return void */ public final function setPathName ($pathName) { @@ -227,7 +218,7 @@ class FrameworkDirectoryPointer extends BaseFrameworkSystem { /** * Getter for path name * - * @return $pathName The current path name + * @return $pathName The current path name */ public final function getPathName () { return $this->pathName;