ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 文件搜索:Finder Nette \ Utils \ Finder类使浏览目录结构真的很容易。 所有示例假定定义了以下类别名: ~~~ use Nette\Utils\Finder; ~~~ 搜索文件 如何在$ dir目录中找到所有* .txt文件,而不递归子目录? ~~~ foreach (Finder::findFiles('*.txt')->in($dir) as $key => $file) { echo $key; // $key is a string containing absolute filename with path echo $file; // $file is an instance of SplFileInfo } ~~~ 因此,finder返回SplFileInfo的实例。 如果目录不存在,则抛出UnexpectedValueException。 如何在$ dir包括子目录中搜索* .txt文件? 而不是in(),使用from(): ~~~ foreach (Finder::findFiles('*.txt')->from($dir) as $file) { echo $file; } ~~~ 通过更多的掩码进行搜索,即使在一次迭代中的更多目录中: ~~~ foreach (Finder::findFiles('*.txt', '*.php') ->in($dir1, $dir2) as $file) { ... } ~~~ 参数也可以是数组: ~~~ foreach (Finder::findFiles($masks)->in($dirs) as $file) { ... } ~~~ 搜索包含名称中的数字的* .txt文件: ~~~ foreach (Finder::findFiles('*[0-9]*.txt')->from($dir) as $file) { ... } ~~~ 搜索* .txt文件,但名称中包含“X”的文件除外: ~~~ foreach (Finder::findFiles('*.txt') ->exclude('*X*')->from($dir) as $file) { ... } ~~~ exclude()在findFiles()之后指定,因此它适用于filename。 要忽略的目录可以使用exclude after from子句指定: ~~~ foreach (Finder::findFiles('*.php') ->from($dir)->exclude('temp', '.git') as $file) { ... } ~~~ 这里exclude()是在from()之后,因此它适用于目录名。 现在有点复杂:搜索位于以'te'开头而不是'temp'的子目录中的* .txt文件: ~~~ foreach (Finder::findFiles('te*/*.txt') ->exclude('temp*/*')->from($dir) as $file) { ... } ~~~ 可以使用limitDepth()方法来限制搜索的深度。 ## 搜索目录 除了文件,可以使用Finder :: findDirectories('subdir *')搜索目录,或者搜索文件和目录:Finder :: find('file.txt')。 在Nette 2.0中,掩码仅适用于文件,而不适用于目录。 ## 过滤 您还可以过滤结果。 例如按大小。 这样我们将遍历大小在100B和200B之间的文件: ~~~ foreach (Finder::findFiles('*.php')->size('>=', 100)->size('<=', 200) ->from($dir) as $file) { ... } ~~~ 或在过去两周内更改的文件: ~~~ foreach (Finder::findFiles('*.php')->date('>', '- 2 weeks') ->from($dir) as $file) { ... } ~~~ 这里我们遍历的行数大于1000的PHP文件。作为一个过滤器,我们使用自定义回调: ~~~ $finder = Finder::findFiles('*.php')->filter(function($file) { return count(file($file->getPathname())) > 1000; })->from($dir); ~~~ 你可以进一步扩展Nette \ Utils \ Finder类,例如使用扩展方法的维度方法: ~~~ Finder::extensionMethod('dimensions', function($finder, $width, $height){ if (!preg_match('#^([=<>!]+)\s*(\d+)$#i', $width, $mW) || !preg_match('#^([=<>!]+)\s*(\d+)$#i', $height, $mH) ) { throw new InvalidArgumentException('Invalid dimensions predicate format.'); } return $finder->filter(function($file) use ($mW, $mH) { return $file->getSize() >= 12 && ($size = getimagesize($file->getPathname())) && (!$mW || Finder::compare($size[0], $mW[1], $mW[2])) && (!$mH || Finder::compare($size[1], $mH[1], $mH[2])); }); }); ~~~ Finder,找到大于50px×50像素的图片: ~~~ foreach (Finder::findFiles('*') ->dimensions('>50', '>50')->from($dir) as $file) { ... } ~~~ ## 连接到Amazon S3 可以使用自定义流,例如Zend_Service_Amazon_S3: ~~~ $s3 = new Zend_Service_Amazon_S3($key, $secret); $s3->registerStreamWrapper('s3'); foreach (Finder::findFiles('photos*') ->size('<=', 1e6)->in('s3://bucket-name') as $file) { echo $file; } ~~~ 方便,对吧? 你肯定会在你的应用程序中找到Finder的使用。