1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017 年 1 月 27 日 |
---|
在 文件系统 中排名第 323
每月下载量 100,405
用于 407 个 Crates (55 个直接使用)
21KB
223 行代码 (不含注释)
symlink
: 以跨平台方式创建(并删除)符号链接
Rust 的标准库公开了创建符号链接的平台特定方式
- 在 Windows 上,
std::os::windows::fs::{symlink_file, symlink_dir}
(因为 Windows 对文件和目录符号链接的处理方式不同); - 在类 Unix 平台和 Redox 上,
std::os::unix::fs::symlink
(因为它们不关心是文件还是目录)。
删除符号链接的情况类似:在类 Unix 平台上,所有符号链接都是文件,必须使用 std::fs::remove_file
删除,但在 Windows 上目录符号链接必须使用 std::fs::remove_dir
删除。
这都很麻烦:一旦你开始处理 Unix 的符号链接,就需要添加大量的 #[cfg]
分支和其他类似杂乱的东...
欢迎使用 symlink
crate。这个 crate 提供了六个跨平台函数
symlink_file
,在 Windows 上创建文件符号链接,在其他平台上创建普通的符号链接;symlink_dir
,在 Windows 上创建目录符号链接,在其他平台上创建普通的符号链接;symlink_auto
,根据目标检查,在 Windows 上创建文件或目录符号链接,在其他平台上创建普通的符号链接;remove_symlink_file
,在 Windows 上删除文件符号链接,在其他平台上删除普通的符号链接;remove_symlink_dir
,在 Windows 上删除目录符号链接,在其他平台上删除普通的符号链接;- 《remove_symlink_auto》,根据路径的检查,在Windows上删除文件或目录符号链接,在其他平台上则是完全普通的符号链接。
“那么,关于 std::fs::soft_link
怎么办?”你可能这么说。是的,自从Rust 1.1.0版本以来,它已经被弃用,因为它在Windows上并没有做什么聪明的事情,它只是创建了一个文件符号链接,这通常是错误的。《symlink_auto》创建一个文件或目录符号链接,具体取决于目标是什么。(与 symlink_file
和 symlink_dir
不同,如果目标不存在或无法获取状态信息,它将返回一个错误。)
根本无法删除符号链接。
这就是为什么这个crate存在的原因。
最佳实践
你应该通常避免使用 symlink_auto
和 remove_symlink_auto
,而更倾向于使用更具体的 symlink_file
或 symlink_dir
和 remove_symlink_file
或 remove_symlink_dir
,具体取决于你所做的事情。(在现实生活中,你几乎总是知道你是在创建文件还是目录符号链接,所以在代码中把它说出来!)
请确保您使用绝对路径作为目标。我还没有测试相对路径是否在平台间得到一致的处理(它们是相对于工作目录还是符号链接源路径)。待办事项!
注意:这并不像看起来那么有用
所以现在你可以创建或删除符号链接,对吧?等等,Windows从Vista开始支持符号链接,但这被视为一种安全或兼容性风险,因此在Windows 10 Creators Update(预计于2017年中期发布;目前可通过Windows Insider Program获得)之前,它需要特殊权限,这基本上意味着你必须以管理员身份运行程序,才能允许它操作符号链接。
此外,在无权限的符号链接创建能够在Windows 10 Creators Update上工作之前,需要先实现Rust PR #38921。所以我们谈论的是Rust 1.16作为最早版本。
我的目标:与Rust集成
我希望以某种形式将其合并到libstd中,因为目前标准库中的符号链接操作支持对于跨平台来说是无望的。我还没有写一个RFC;它应该肯定开始作为一个独立的crate(这就是这个的原因)。以下是我的一些想法
关于 symlink_auto
:它故意没有被命名为 symlink
;我希望人们不会盲目地伸手,而是会思考他们在做什么。以下是一些可能发生的事情(按照我的偏好顺序)
- 它可能不存在。它真的不是 必需的,让人们对懒惰的态度并不总是好的。鼓励跨平台性!
- 它可以以
std::fs::symlink_auto
的形式存在。这样就可以清楚地区分。 - 可以将
std::fs::soft_link
取消弃用,并更改其在Windows上的语义,从“创建文件符号链接”更改为“根据需要创建文件或目录符号链接,如果目标无法获取状态信息,则返回错误”。 - 可以将
std::fs::soft_link
取消弃用,并更改其在Windows上的语义,从“创建文件符号链接”更改为“根据需要创建文件或目录符号链接,如果目标无法获取状态信息,则返回文件符号链接”。 - 它也可以以
std::fs::symlink
的形式存在。这是显而易见的名字,但正如之前提到的,这鼓励了Windows上的低效和不精确。
关于 symlink_dir
和 symlink_file
:
-
std::fs::{symlink_file, symlink_dir}
,匹配symlink_auto
或无匹配。 -
std::fs::{soft_link_file, soft_link_dir}
,如果未弃用,则匹配soft_link
。但无论如何,我不喜欢“软链接”这个名字:没有人这样称呼它们,我们都称之为符号链接。
注意,尽管建议与symlink_auto
的某些方法匹配,但选择仍然是独立的;展示了十种可行的组合。
关于remove_*
:我认为对其他三个函数所做的操作将指导这三个函数的操作。
用法
从Cargo开始:它是symlink
crate在crates.io。
此库中的不安全代码
仅在Windows上,remove_symlink_auto
中存在一些不可避免的不安全代码,用于确定符号链接是文件符号链接还是目录符号链接,因为此细节在标准库中没有暴露。
作者
Chris Morgan (chris-morgan) 是此库的主要作者和维护者。
许可证
此库的分布条款类似于Rust:MIT许可证和Apache许可证(版本2.0)的双重许可。
有关详细信息,请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT。