diff --git a/framework/yii/helpers/base/FileHelper.php b/framework/yii/helpers/base/FileHelper.php index 954c86e..d76ebc7 100644 --- a/framework/yii/helpers/base/FileHelper.php +++ b/framework/yii/helpers/base/FileHelper.php @@ -169,4 +169,26 @@ class FileHelper } closedir($handle); } + + /** + * Removes a directory recursively. + * @param string $directory to be deleted recursively. + */ + public static function removeDirectory($directory) + { + $items = glob($directory . DIRECTORY_SEPARATOR . '{,.}*', GLOB_MARK | GLOB_BRACE); + foreach ($items as $item) { + if (basename($item) == '.' || basename($item) == '..') { + continue; + } + if (substr($item, -1) == DIRECTORY_SEPARATOR) { + self::removeDirectory($item); + } else { + unlink($item); + } + } + if (is_dir($directory)) { + rmdir($directory); + } + } } diff --git a/tests/unit/framework/helpers/FileHelperTest.php b/tests/unit/framework/helpers/FileHelperTest.php index 89a5a02..2027510 100644 --- a/tests/unit/framework/helpers/FileHelperTest.php +++ b/tests/unit/framework/helpers/FileHelperTest.php @@ -9,6 +9,9 @@ use yii\test\TestCase; */ class FileHelperTest extends TestCase { + /** + * @var string test files path. + */ private $testFilePath = ''; public function setUp() @@ -46,7 +49,8 @@ class FileHelperTest extends TestCase // Tests : - public function testCopyDirectory() { + public function testCopyDirectory() + { $basePath = $this->testFilePath; $srcDirName = $basePath . DIRECTORY_SEPARATOR . 'test_src_dir'; mkdir($srcDirName, 0777, true); @@ -68,4 +72,27 @@ class FileHelperTest extends TestCase $this->assertEquals($content, file_get_contents($fileName), 'Incorrect file content!'); } } + + public function testRemoveDirectory() + { + $basePath = $this->testFilePath; + $dirName = $basePath . DIRECTORY_SEPARATOR . 'test_dir_for_remove'; + mkdir($dirName, 0777, true); + $files = array( + 'file1.txt' => 'file 1 content', + 'file2.txt' => 'file 2 content', + ); + foreach ($files as $name => $content) { + file_put_contents($dirName . DIRECTORY_SEPARATOR . $name, $content); + } + $subDirName = $dirName . DIRECTORY_SEPARATOR . 'test_sub_dir'; + mkdir($subDirName, 0777, true); + foreach ($files as $name => $content) { + file_put_contents($subDirName . DIRECTORY_SEPARATOR . $name, $content); + } + + FileHelper::removeDirectory($dirName); + + $this->assertFalse(file_exists($dirName), 'Unable to remove directory!'); + } } \ No newline at end of file