Skip to content

Commit 86fa1b1

Browse files
committed
up: update some dir itertor methods
1 parent 5fae927 commit 86fa1b1

File tree

3 files changed

+53
-20
lines changed

3 files changed

+53
-20
lines changed

src/Directory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
namespace Toolkit\FsUtil;
1111

12+
use Closure;
1213
use InvalidArgumentException;
14+
use SplFileInfo;
1315
use Toolkit\FsUtil\Exception\FileNotFoundException;
1416
use Toolkit\FsUtil\Traits\DirOperateTrait;
1517
use function basename;

src/FileSystem.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace Toolkit\FsUtil;
1111

12+
use FilesystemIterator;
1213
use InvalidArgumentException;
1314
use RecursiveCallbackFilterIterator;
1415
use RecursiveDirectoryIterator;
@@ -236,19 +237,34 @@ public static function check(string $file, array|string $ext = ''): void
236237
}
237238

238239
/**
239-
* @param string $srcDir
240+
* Usage:
241+
*
242+
* ```php
243+
* $filter = Dir::getPhpFileFilter();
244+
*
245+
* // $info is instance of \SplFileInfo
246+
* foreach(Dir::getIterator($srcDir, $filter) as $info) {
247+
* // $info->getFilename(); ...
248+
* }
249+
* ```
250+
*
251+
* @param string $srcDir
240252
* @param callable $filter
253+
* @param int $flags
241254
*
242255
* @return RecursiveIteratorIterator
243-
* @throws InvalidArgumentException
244256
*/
245-
public static function getIterator(string $srcDir, callable $filter): RecursiveIteratorIterator
257+
public static function getIterator(
258+
string $srcDir,
259+
callable $filter,
260+
int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO
261+
): RecursiveIteratorIterator
246262
{
247263
if (!$srcDir || !file_exists($srcDir)) {
248264
throw new InvalidArgumentException('Please provide a exists source directory.');
249265
}
250266

251-
$directory = new RecursiveDirectoryIterator($srcDir);
267+
$directory = new RecursiveDirectoryIterator($srcDir, $flags);
252268
$filterIterator = new RecursiveCallbackFilterIterator($directory, $filter);
253269

254270
return new RecursiveIteratorIterator($filterIterator);

src/Traits/DirOperateTrait.php

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
namespace Toolkit\FsUtil\Traits;
44

5+
use Closure;
56
use DirectoryIterator;
67
use LogicException;
78
use RecursiveIteratorIterator;
9+
use SplFileInfo;
810
use Throwable;
911
use Toolkit\FsUtil\Exception\FileNotFoundException;
1012
use Toolkit\FsUtil\Exception\FileSystemException;
13+
use Toolkit\FsUtil\FileSystem;
1114
use function closedir;
1215
use function opendir;
1316
use function readdir;
@@ -20,23 +23,13 @@
2023
trait DirOperateTrait
2124
{
2225
/**
26+
* Usage:
27+
*
2328
* ```php
24-
* $filter = function ($current, $key, $iterator) {
25-
* // \SplFileInfo $current
26-
* // Skip hidden files and directories.
27-
* if ($current->getFilename()[0] === '.') {
28-
* return false;
29-
* }
30-
* if ($current->isDir()) {
31-
* // Only recurse into intended subdirectories.
32-
* return $current->getFilename() !== '.git';
33-
* }
34-
* // Only consume files of interest.
35-
* return strpos($current->getFilename(), '.php') !== false;
36-
* };
29+
* $filter = Dir::getPhpFileFilter();
3730
*
3831
* // $info is instance of \SplFileInfo
39-
* foreach(Directory::getRecursiveIterator($srcDir, $filter) as $info) {
32+
* foreach(Dir::getRecursiveIterator($srcDir, $filter) as $info) {
4033
* // $info->getFilename(); ...
4134
* }
4235
* ```
@@ -45,11 +38,33 @@ trait DirOperateTrait
4538
* @param callable $filter
4639
*
4740
* @return RecursiveIteratorIterator
48-
* @throws LogicException
4941
*/
5042
public static function getRecursiveIterator(string $srcDir, callable $filter): RecursiveIteratorIterator
5143
{
52-
return self::getIterator($srcDir, $filter);
44+
return FileSystem::getIterator($srcDir, $filter);
45+
}
46+
47+
/**
48+
* @return Closure
49+
*/
50+
public static function getPhpFileFilter(): callable
51+
{
52+
return static function (SplFileInfo $f) {
53+
$name = $f->getFilename();
54+
55+
// Skip hidden files and directories.
56+
if (str_starts_with($name, '.')) {
57+
return false;
58+
}
59+
60+
// go on read sub-dir
61+
if ($f->isDir()) {
62+
return true;
63+
}
64+
65+
// php file
66+
return $f->isFile() && str_ends_with($name, '.php');
67+
};
5368
}
5469

5570
/**

0 commit comments

Comments
 (0)