/** * Creates an object to represent a directory on the filesystem * * If multiple fDirectory objects are created for a single directory, * they will reflect changes in each other including rename and delete * actions. * * @throws fValidationException When no directory was specified, when the directory does not exist or when the path specified is not a directory * * @param string $directory The path to the directory * @param boolean $skip_checks If file checks should be skipped, which improves performance, but may cause undefined behavior - only skip these if they are duplicated elsewhere * @return fDirectory */ public function __construct($directory, $skip_checks = FALSE) { if (!$skip_checks) { if (empty($directory)) { throw new fValidationException('No directory was specified'); } if (!is_readable($directory)) { throw new fValidationException('The directory specified, %s, does not exist or is not readable', $directory); } if (!is_dir($directory)) { throw new fValidationException('The directory specified, %s, is not a directory', $directory); } } $directory = self::makeCanonical(realpath($directory)); $this->directory =& fFilesystem::hookFilenameMap($directory); $this->deleted =& fFilesystem::hookDeletedMap($directory); // If the directory is listed as deleted and we are not inside a transaction, // but we've gotten to here, then the directory exists, so we can wipe the backtrace if ($this->deleted !== NULL && !fFilesystem::isInsideTransaction()) { fFilesystem::updateDeletedMap($directory, NULL); } }
/** * Re-inserts the file back into the filesystem map when unserialized * * @internal * * @return void */ public function __wakeup() { $file = $this->file; $deleted = $this->deleted; $this->file =& fFilesystem::hookFilenameMap($file); $this->deleted =& fFilesystem::hookDeletedMap($file); if ($deleted !== NULL) { fFilesystem::updateDeletedMap($file, $deleted); } }