_filePath = $filePath; $this->_fileLocation = isset($pathInfo['dirname']) ? $pathInfo['dirname'] : ''; $this->_fileName = isset($pathInfo['basename']) ? $pathInfo['basename'] : ''; } /** * Close file if it's not closed before object destruction */ public function __destruct() { if ($this->_fileHandler) { $this->_close(); } } /** * Open file * * @param string $mode * @param int $chmod * @return void * @throws LocalizedException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function open($mode = 'w+', $chmod = null) { $this->_isInWriteMode = $this->_isWritableMode($mode); if ($this->_isInWriteMode) { if (!is_writable($this->_fileLocation)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'You don\'t have permissions to write to the "%1" file.', [$this->_fileLocation] ) ); } if (is_file($this->_filePath) && !is_writable($this->_filePath)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'You don\'t have the permissions to open the "%1" file for writing access.', [$this->_fileName] ) ); } } if ($this->_isReadableMode($mode) && (!is_file($this->_filePath) || !is_readable($this->_filePath))) { if (!is_file($this->_filePath)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'The "%1" file doesn\'t exist. Verify the file and try again.', [$this->_filePath] ) ); } if (!is_readable($this->_filePath)) { throw new LocalizedException( new \Magento\Framework\Phrase( 'You don\'t have permissions to read the "%1" file.', [$this->_filePath] ) ); } } $this->_open($mode); $this->_chmod = $chmod; } /** * Write data to file * * @param string $data * @return void */ public function write($data) { $this->_checkFileOpened(); $this->_write($data); } /** * Read data from file * * @param int $length * @return string|boolean */ public function read($length = 4096) { $data = false; $this->_checkFileOpened(); if ($length > 0) { $data = $this->_read($length); } return $data; } /** * Check whether end of file reached * * @return boolean */ public function eof() { $this->_checkFileOpened(); return $this->_eof(); } /** * Close file * * @return void */ public function close() { $this->_checkFileOpened(); $this->_close(); $this->_fileHandler = false; if ($this->_isInWriteMode && isset($this->_chmod)) { @chmod($this->_filePath, $this->_chmod); } } /** * Implementation of file opening * * @param string $mode * @return void * @throws LocalizedException */ protected function _open($mode) { $this->_fileHandler = @fopen($this->_filePath, $mode); if (false === $this->_fileHandler) { throw new LocalizedException( new \Magento\Framework\Phrase('The "%1" file failed to open.', [$this->_filePath]) ); } } /** * Implementation of writing data to file * * @param string $data * @return void * @throws LocalizedException */ protected function _write($data) { $result = @fwrite($this->_fileHandler, $data); if (false === $result) { throw new LocalizedException( new \Magento\Framework\Phrase('The data failed to write to "%1".', [$this->_filePath]) ); } } /** * Implementation of file reading * * @param int $length * @return string * @throws LocalizedException */ protected function _read($length) { $result = fread($this->_fileHandler, $length); if (false === $result) { throw new LocalizedException( new \Magento\Framework\Phrase('Failed to read data from %1', [$this->_filePath]) ); } return $result; } /** * Implementation of EOF indicator * * @return boolean */ protected function _eof() { return feof($this->_fileHandler); } /** * Implementation of file closing * * @return void */ protected function _close() { fclose($this->_fileHandler); } /** * Check whether requested mode is writable mode * * @param string $mode * @return int */ protected function _isWritableMode($mode) { return preg_match('/(^[waxc])|(\+$)/', $mode); } /** * Check whether requested mode is readable mode * * @param string $mode * @return bool */ protected function _isReadableMode($mode) { return !$this->_isWritableMode($mode); } /** * Check whether file is opened * * @return void * @throws LocalizedException */ protected function _checkFileOpened() { if (!$this->_fileHandler) { throw new LocalizedException(new \Magento\Framework\Phrase('File not opened')); } } }