1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017 年 1 月 27 日

文件系统 中排名第 323

Download history 23621/week @ 2024-03-14 23306/week @ 2024-03-21 24193/week @ 2024-03-28 27135/week @ 2024-04-04 25171/week @ 2024-04-11 28680/week @ 2024-04-18 26338/week @ 2024-04-25 24128/week @ 2024-05-02 25413/week @ 2024-05-09 22326/week @ 2024-05-16 19856/week @ 2024-05-23 25675/week @ 2024-05-30 26674/week @ 2024-06-06 25204/week @ 2024-06-13 24399/week @ 2024-06-20 19052/week @ 2024-06-27

每月下载量 100,405
用于 407 Crates (55 个直接使用)

MIT/Apache

21KB
223 行代码 (不含注释)

symlink: 以跨平台方式创建(并删除)符号链接

Build Status

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_filesymlink_dir 不同,如果目标不存在或无法获取状态信息,它将返回一个错误。)

根本无法删除符号链接。

这就是为什么这个crate存在的原因。

最佳实践

你应该通常避免使用 symlink_autoremove_symlink_auto,而更倾向于使用更具体的 symlink_filesymlink_dirremove_symlink_fileremove_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;我希望人们不会盲目地伸手,而是会思考他们在做什么。以下是一些可能发生的事情(按照我的偏好顺序)

  1. 它可能不存在。它真的不是 必需的,让人们对懒惰的态度并不总是好的。鼓励跨平台性!
  2. 它可以以 std::fs::symlink_auto 的形式存在。这样就可以清楚地区分。
  3. 可以将 std::fs::soft_link 取消弃用,并更改其在Windows上的语义,从“创建文件符号链接”更改为“根据需要创建文件或目录符号链接,如果目标无法获取状态信息,则返回错误”。
  4. 可以将 std::fs::soft_link 取消弃用,并更改其在Windows上的语义,从“创建文件符号链接”更改为“根据需要创建文件或目录符号链接,如果目标无法获取状态信息,则返回文件符号链接”。
  5. 它也可以以 std::fs::symlink 的形式存在。这是显而易见的名字,但正如之前提到的,这鼓励了Windows上的低效和不精确。

关于 symlink_dirsymlink_file:

  1. std::fs::{symlink_file, symlink_dir},匹配symlink_auto或无匹配。

  2. 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。

无运行时依赖