# 文件搜索: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的使用。
- Nette简介
- 快速开始
- 入门
- 主页
- 显示文章详细页
- 文章评论
- 创建和编辑帖子
- 权限验证
- 程序员指南
- MVC应用程序和控制器
- URL路由
- Tracy - PHP调试器
- 调试器扩展
- 增强PHP语言
- HTTP请求和响应
- 数据库
- 数据库:ActiveRow
- 数据库和表
- Sessions
- 用户授权和权限
- 配置
- 依赖注入
- 获取依赖关系
- DI容器扩展
- 组件
- 字符串处理
- 数组处理
- HTML元素
- 使用URL
- 表单
- 验证器
- 模板
- AJAX & Snippets
- 发送电子邮件
- 图像操作
- 缓存
- 本土化
- Nette Tester - 单元测试
- 与Travis CI的持续集成
- 分页
- 自动加载
- 文件搜索:Finder
- 原子操作