rust 创建和删除符号链接

pw9qyyiw  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(491)

嗨,我试图在rust中符号链接一个目录,后来又试图取消链接。我正在寻找一种跨平台的方法来做到这一点。
我试过使用symlink机箱来实现这一点。在unix系统中,crate使用fs::remove_file来删除符号链接。但实际使用时会抛出错误。错误返回path is a Directory。我还看到在fnm(here)中使用了相同的函数。我不知道我应该做什么。至于创建符号链接,crate使用std::os::unix::fs::symlink来创建符号链接,但是由于某种原因,我的符号链接目录仍然是空的。使用的总体代码或多或少如下:

use std::path::Path;

#[cfg(unix)]
pub fn symlink_dir<P: AsRef<Path>, U: AsRef<Path>>(from: P, to: U) -> std::io::Result<()> {
    std::os::unix::fs::symlink(from, to)?;
    Ok(())
}

#[cfg(windows)]
pub fn symlink_dir<P: AsRef<Path>, U: AsRef<Path>>(from: P, to: U) -> std::io::Result<()> {
    junction::create(from, to)?;
    Ok(())
}

#[cfg(windows)]
pub fn remove_symlink_dir<P: AsRef<Path>>(path: P) -> std::io::Result<()> {
    std::fs::remove_dir(path)?;
    Ok(())
}

#[cfg(unix)]
pub fn remove_symlink_dir<P: AsRef<Path>>(path: P) -> std::io::Result<()> {
    std::fs::remove_file(path)?;
    Ok(())
}

还没有在windows上试过,所以不确定windows的相对部分是否能用。只在linux操作系统上使用github codespaces尝试过。我正试图为Dart(here)制作一个类似于版本管理器的nvm,我需要将当前使用的版本目录符号链接到current目录或类似的目录。

nfs0ujit

nfs0ujit1#

Rust的std::fs::remove_file文档说它对应于Unix上的unlink系统调用,而Unix文档则对应于unlink状态If the name referred to a symbolic link, the link is removed。因此,应该可以使用std::fs::remove_file删除符号链接(从而也删除symlink::remove_symlink_dir)。
看起来结尾的斜杠可能会导致您提到的错误。例如,在/path/to/my/symlink上调用unlink应该可以,但在/path/to/my/symlink/上不能。

v09wglhw

v09wglhw2#

我还没有找到我的问题的答案,但我最终解决了它。不知道为什么使用fs::remove_file对我不起作用。所以我蛮力强迫它,只是删除了符号链接使用fs::remove_dir_all。只要它工作,我很好。我一直在这里使用它,工作正常,虽然我仍然认为在unix上使用fs::remove_file和在windows上使用fs::remove_dir应该是这样的。

相关问题