diff --git a/lib/private/helper.php b/lib/private/helper.php
index 243baa46948d24ae29afc687f727e5ebcbd1528f..206c20d9169ed96fe01fdb8628f448cfe68275d8 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -405,15 +405,19 @@ class OC_Helper {
 	 */
 	static function rmdirr($dir) {
 		if (is_dir($dir)) {
-			$files = scandir($dir);
-			// FIXME: use flat array instead of recursion to avoid
-			// too many levels
-			foreach ($files as $file) {
-				if ($file !== '' && $file !== "." && $file !== "..") {
-					self::rmdirr("$dir/$file");
+			$files = new RecursiveIteratorIterator(
+				new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
+				RecursiveIteratorIterator::CHILD_FIRST
+			);
+
+			foreach ($files as $fileInfo) {
+				/** @var FilesystemIterator $fileInfo */
+				if ($fileInfo->isDir()) {
+					rmdir($fileInfo->getRealPath());
+				} else {
+					unlink($fileInfo->getRealPath());
 				}
 			}
-			rmdir($dir);
 		} elseif (file_exists($dir)) {
 			unlink($dir);
 		}