From b848ddb7f02e5c34c107047ef1d278d33c3d0b2d Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 12 Apr 2016 10:59:55 +0200 Subject: [PATCH] [Filesystem] Better error handling in remove() --- .../Component/Filesystem/Filesystem.php | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index dcef5c64ae..3c98e25075 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -140,24 +140,27 @@ class Filesystem */ public function remove($files) { - $files = iterator_to_array($this->toIterator($files)); + if ($files instanceof \Traversable) { + $files = iterator_to_array($files, false); + } elseif (!is_array($files)) { + $files = array($files); + } $files = array_reverse($files); foreach ($files as $file) { - if (@(unlink($file) || rmdir($file))) { - continue; - } if (is_link($file)) { // See https://bugs.php.net/52176 - $error = error_get_last(); - throw new IOException(sprintf('Failed to remove symlink "%s": %s.', $file, $error['message'])); + if (!@(unlink($file) || '\\' !== DIRECTORY_SEPARATOR || rmdir($file)) && file_exists($file)) { + $error = error_get_last(); + throw new IOException(sprintf('Failed to remove symlink "%s": %s.', $file, $error['message'])); + } } elseif (is_dir($file)) { - $this->remove(new \FilesystemIterator($file)); + $this->remove(new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS)); - if (!@rmdir($file)) { + if (!@rmdir($file) && file_exists($file)) { $error = error_get_last(); throw new IOException(sprintf('Failed to remove directory "%s": %s.', $file, $error['message'])); } - } elseif (file_exists($file)) { + } elseif (!@unlink($file) && file_exists($file)) { $error = error_get_last(); throw new IOException(sprintf('Failed to remove file "%s": %s.', $file, $error['message'])); }