本文主要介绍一下 glob 库的使用。
glob 库的 pub 仓库地址:glob
1. glob 库的介绍
glob 库提供了文件和目录的通配符规则,它可以帮助我们检查某个 path 路径是否满足我们给定的通配符规则,同时支持列出所有满足通配符条件的文件和目录。
2. 依赖 glob 库
2.1 添加依赖
dependencies:
glob: ^2.0.2
glob 的版本号参考:Stable versions of glob
2.2 导包
import 'package:glob/glob.dart';
3. glob 库的使用
3.1 构造一个 glob
想要创建一个 glob 对象,只需要使用 Glob()
即可。
import 'package:glob/glob.dart';
/// 最好定义为全局变量,方便复用
final dartFile = Glob("**.dart");
3.2 检查是否匹配
检查一个 path 是否满足 Glob 的条件,使用 Glob.matches()
。
import 'package:glob/glob.dart';
final dartFile = Glob("**.dart");
void main(List<String> arguments) {
for (var argument in arguments) {
if (dartFile.matches(argument)) print(argument);
}
}
3.3 列出所有满足条件的文件
可以使用 Glob.list()
或 Glob.listSync()
列出与 glob 匹配的所有文件。
import 'package:glob/glob.dart';
import 'package:glob/list_local_fs.dart';
final dartFile = Glob("**.dart");
// Recursively list all Dart files in the current directory.
void main(List<String> arguments) {
for (var entity in dartFile.listSync()) {
print(entity.path);
}
}
4. glob 库的通配符规则
4.1 匹配当前目录下,文件名中的任意字符:*
例子: lib/*.dart
会匹配 lib/glob.dart
但不会匹配 lib/src/utils.dart
。
4.2 跨目录匹配文件名中的任意字符:**
例子:lib/**.dart
会匹配 lib/glob.dart
和 lib/src/utils.dart
。
如果 **
出现在 glob 的开头,它将不匹配 绝对路径
或以 ../ 开头
的路径。
例如,**.dart
不会匹配 /foo.dart
,但 /**.dart
会匹配。
4.3 匹配任何单个字符:?
这 ?
字符匹配除 /
之外的 单个字符
。 与 *
不同,它不会匹配多于或少于一个字符。
例如, test?.dart
将匹配 test1.dart
但不匹配 test10.dart
或 test.dart
4.4 匹配给定范围内的字符:[…]
匹配几个字符中的一个。它可以包含单个字符,例如 [abc],在这种情况下,它将匹配任何这些字符;
它可以包含范围,例如 [a-zA-Z],在这种情况下,它将匹配范围内的任何字符;或者它可以包含两者的混合。
例如,test[a-zA-Z_].dart
将匹配 testx.dart
、testA.dart
和 test_.dart
,但不匹配 test-.dart
。
如果它以 ^
或 !
开头,则匹配所有 未提及
的字符。例如,test[^a-z].dart
将匹配 test1.dart
但不匹配 testa.dart
。
4.5 匹配几种可能性之一:{…,…}
{...,...}
结构匹配几个选项之一,每个选项本身都是一个 glob。
例如,lib/{*.dart,src/*}
匹配 lib/glob.dart
和 lib/src/data.txt
。 它可以包含任何数量大于一的选项,甚至可以包含嵌套选项。
4.6 转义字符:\
\
字符可以在任何上下文中用于转义一个在语义上有意义的字符。 例如,*.dart
匹配 *.dart
但不匹配 test.dart
。