diff --git a/src/ZM/Utils/DataProvider.php b/src/ZM/Utils/DataProvider.php index 9986899e..0417ae43 100644 --- a/src/ZM/Utils/DataProvider.php +++ b/src/ZM/Utils/DataProvider.php @@ -127,10 +127,10 @@ class DataProvider /** * 递归或非递归扫描目录,可返回相对目录的文件列表或绝对目录的文件列表 * - * @param string $dir 目录 - * @param bool $recursive 是否递归扫描子目录 - * @param bool|string $relative 是否返回相对目录,如果为true则返回相对目录,如果为false则返回绝对目录 - * @param bool $include_dir 非递归模式下,是否包含目录 + * @param string $dir 目录 + * @param bool $recursive 是否递归扫描子目录 + * @param bool|mixed|string $relative 是否返回相对目录,如果为true则返回相对目录,如果为false则返回绝对目录 + * @param bool $include_dir 非递归模式下,是否包含目录 * @return array|false * @since 2.5 */ @@ -147,6 +147,9 @@ class DataProvider $list = []; if ($relative === true) { $relative = $dir; + } elseif ($relative !== false && !is_string($relative)) { + Console::warning(zm_internal_errcode('E00058') . "Relative path is not generated: wrong base directory ({$relative})"); + return false; } foreach ($r as $v) { if ($v == '.' || $v == '..') { @@ -162,9 +165,6 @@ class DataProvider $list[] = ltrim(mb_substr($sub_file, mb_strlen($relative)), '/'); } elseif ($relative === false) { $list[] = $sub_file; - } else { - Console::warning(zm_internal_errcode('E00058') . "Relative path is not generated: wrong base directory ({$relative})"); - return false; } } } diff --git a/tests/ZM/Utils/DataProviderTest.php b/tests/ZM/Utils/DataProviderTest.php index 84b8178a..a52886d1 100644 --- a/tests/ZM/Utils/DataProviderTest.php +++ b/tests/ZM/Utils/DataProviderTest.php @@ -29,8 +29,32 @@ class DataProviderTest extends TestCase public function testScanDirFiles(): void { + // 常规测试 $files = DataProvider::scanDirFiles(SOURCE_ROOT_DIR . '/src/Module'); $this->assertContains(SOURCE_ROOT_DIR . '/src/Module/Example/Hello.php', $files); + // 检查文件夹不存在的判断 + $random_id = uuidgen(); + $dir = '/tmp/' . $random_id; + // 检查目录不存在是否返回false + $this->assertFalse(DataProvider::scanDirFiles($dir)); + mkdir($dir); + // 检查目录存在时返回空 + $this->assertEquals([], DataProvider::scanDirFiles($dir)); + chmod($dir, 000); + // 目录无权限时也返回false + $this->assertFalse(DataProvider::scanDirFiles($dir)); + chmod($dir, 0755); + mkdir($dir . '/test'); + file_put_contents($dir . '/test/a.txt', 'Hello world!'); + // 检查目录下文件是否正确返回 + $this->assertEquals([$dir . '/test/a.txt'], DataProvider::scanDirFiles($dir)); + // 检查不递归时包含目录的模式 + $this->assertEquals([], DataProvider::scanDirFiles($dir, false)); + $this->assertEquals([$dir . '/test'], DataProvider::scanDirFiles($dir, false, false, true)); + // 检查相对目录是否能正常返回 + $this->assertEquals(['test/a.txt'], DataProvider::scanDirFiles($dir, true, true)); + // relative传入奇怪的东西就返回false + $this->assertFalse(DataProvider::scanDirFiles($dir, true, null, true)); } public function testGetFrameworkRootDir(): void