本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
path 库的 pub 仓库地址:
path
1. path 库的介绍
path 是针对 Dart 语言设计的一个全面的、跨平台的路径操作库。path 插件提供了操作路径的常用操作:加入、拆分、规范化等。
2. path 库的使用
2.1 添加依赖
dependencies:
path: ^1.8.1
path 的版本号参考:Stable versions of path
2.2 导包
import 'package:path/path.dart' as p;
import 'package:path/path.dart';
2.3 最常用的函数:join()
path 库最常用方法是顶级函数 join()。join 函数会根据你当前的工作目录和使用的主机平台的路径样式(POSIX
,Windows
,或 URLs
)来将给定的路径连接成单个路径,并返回。
POSIX 风格的路径使用 /
(正斜杠)作为分隔符。绝对路径以 /
开头。适用于 UNIX
、Linux
、Mac OS X
等。
Windows 风格的路径使用 \
(反斜杠)作为分隔符。绝对路径以驱动器号和冒号开头(例如,C:
),或者两个反斜杠(\\
)作为 UNC 路径。
URLs 不是文件系统路径,path 支持它是为了更容易在浏览器中操作 URL 路径。URLs 使用 /
(正斜杠)作为分隔符。绝对路径可以以一个协议和可选的主机名(例如。https://dart.dev
,文件://
),也可以在尾部加一个 /
。
代码片段:
p.join('directory', 'file.txt');
调用 join() 会以当前平台的目录分隔符连接“directory”和“file.txt”。join 函数会返回拼接后的路径 String。
以我使用的 mac 电脑为例子,会使用正斜杠 /
分隔符来连接,如果将 p.join('directory', 'file.txt')
的结果打印出来会得到如下的一个 String:
directory/file.txt
如果你想指定使用某个特定平台的路径分隔符,你可以创建一个 Context
并给指定一个 Style
:
import 'package:path/path.dart' as p;
String getContextPathString() {
var context = p.Context(style: p.Style.windows);
return context.join('directory', 'file.txt');
此时,输出 context.join('directory', 'file.txt')
的结果会得到如下 String:
directory\file.txt
👉 使用 join 的一些规则
1.join() 最多只能接收 8
个参数。
来看看 join 函数的定义就知道了:
String join(String part1,
[String? part2,
String? part3,
String? part4,
String? part5,
String? part6,
String? part7,
String? part8]) =>
context.join(part1, part2, part3, part4, part5, part6, part7, part8);
2.如果任何 part 参数以路径分隔符结尾,则会被忽略掉
代码片段:
p.join('directory/', 'to', 'foo');
3.如果某个 part 参数使用了绝对路径,那么它之前的 part 参数都将被忽略
代码片段:
p.join('directory', '/to', 'foo');
2.4 joinAll() 函数
joinAll() 函数的作用和路径的生成规则与 join() 函数是一样的,只是需要的参数不同。
joinAll() 接收一个 Iterable<String>
参数。
代码片段:
p.joinAll(['path', 'to', 'foo']);
p.joinAll(['path/', 'to', 'foo']);
p.joinAll(['path', '/to', 'foo']);
👉 Tips
对于固定数量的 part 路径,通常使用 join() 函数。
2.5 dirname(String path) 函数
作用:获取最后一个分隔符之前的 path 部分。
代码片段:
p.dirname('path/to/foo.dart');
p.dirname('path/to');
p.dirname('path/to/');
p.dirname('/');
p.dirname('c:\');
p.dirname('foo');
p.dirname('');
2.6 normalize(String path) 标准化路径
normalize() 通过处理 ..
和 .
来简化路径,并且会尽可能地删除多余的路径分隔符。
代码片段:
p.normalize('path/./to/..//file.text');
2.7 canonicalize(String path) 规范化路径
如果两个输入路径都指向同一位置时,调用 canonicalize() 会保证返回相同的路径。 与 normalize() 不同,它尽可能返回 绝对路径
,并在 Windows 上规范化 ASCII 大小写。
2.8 basename(String path) 函数
作用:获取最后一个分隔符之后的 path 部分。
代码片段:
p.basename('path/to/foo.dart'); // 返回 'foo.dart'
p.basename('path/to'); // 返回 'to'
/// 末尾的分隔符会被忽略
p.basename('path/to/'); // 返回 'to'
2.9 basenameWithoutExtension(String path) 函数
作用:获取最后一个分隔符之后的 path 部分,并且没有任何文件后缀名。
代码片段:
p.basenameWithoutExtension('path/to/foo.dart');
p.basenameWithoutExtension('path/to/foo.dart/');
2.10 extension(String path, [int level = 1]) 函数
作用:获取 path 的文件扩展名:basename 的最后一部分,包括 .
本身。
代码片段:
p.extension('path/to/foo.dart');
p.extension('path/to/foo');
p.extension('path.to/foo');
p.extension('path/to/foo.dart.js');
p.extension('~/.bashrc');
p.extension('~/.notes.txt');
p.extension('foo.bar.dart.js', 2);
p.extension('foo.bar.dart.js', 3);
p.extension('path/to/foo.bar.dart.js', 2);
p.extension('foo.bar.dart.js', 10);
2.11 rootPrefix(String path) 函数
作用:如果是绝对路径,则返回 path 的根,如果是相对路径,则返回空字符串。
p.rootPrefix('path/to/foo');
p.rootPrefix('/path/to/foo');
p.rootPrefix(r'path\to\foo');
p.rootPrefix(r'C:\path\to\foo');
p.rootPrefix(r'\\server\share\a\b');
p.rootPrefix('path/to/foo');
p.rootPrefix('https://dart.dev/path/to/foo');
2.12 split(String path) 函数
作用:使用当前平台的分隔符对 path 进行拆分。
代码片段:
p.split('path/to/foo');
p.split('path/../foo');
p.split('/path/to/foo');
p.split(r'C:\path\to\foo');
p.split(r'\\server\share\path\to\foo');
p.split('https://dart.dev/path/to/foo');
2.13 relative(String path, {String? from}) 函数
作用:尝试将 path 转换为当前目录的等效相对路径。
代码片段:
p.relative('/root/path/a/b.dart');
p.relative('/root/other.dart');
p.relative('/root/path/a/b.dart', from: '/root/path');
p.relative('/root/other.dart', from: '/root/path');
2.14 isWithin(String parent, String child)
作用:如果 child
是 parent
下面的路径,则返回 true
,否则返回 false
。
代码片段:
p.isWithin('/root/path', '/root/path/a');
p.isWithin('/root/path', '/root/other');
p.isWithin('/root/path', '/root/path')
2.15 equals(String path1, String path2)
作用:如果 path1 指向与 path2 相同的位置,则返回 true
,否则 false
。
代码片段:
path.equals('a/b', 'a/b') -> true
2.16 withoutExtension(String path) 函数
作用:从 path 的最后一部分删除末尾扩展名。
代码片段:
p.withoutExtension('path/to/foo.dart');
2.17 setExtension(String path, String extension) 函数
作用:将 path 末尾的扩展名设置为 extension
参数的值。如果 path 末尾没有扩展名,会将 extension
的值添加到末尾。
代码片段:
p.setExtension('path/to/foo.dart', '.js')
p.setExtension('path/to/foo.dart.js', '.map')
p.setExtension('path/to/foo', '.js')
2.18 fromUri
作用:返回 uri 表示的路径,可以是 String 或 Uri。
代码片段:
p.fromUri('file:///path/to/foo')
p.fromUri('file:///C:/path/to/foo')
p.fromUri('https://dart.dev/path/to/foo')
p.fromUri('path/to/foo');
2.19 prettyUri
作用:可以传递一个 String 或者 Uri,将返回简洁、易读的 uri。
代码片段:
p.prettyUri('file:///root/path/a/b.dart');
p.prettyUri('https://dart.dev/');
p.prettyUri('file:///C:/root/path/a/b.dart');
p.prettyUri('https://dart.dev/');
p.prettyUri('https://dart.dev/root/path/a/b.dart');
p.prettyUri('file:///root/path');