嗨,我试图在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
目录或类似的目录。
2条答案
按热度按时间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/
上不能。v09wglhw2#
我还没有找到我的问题的答案,但我最终解决了它。不知道为什么使用
fs::remove_file
对我不起作用。所以我蛮力强迫它,只是删除了符号链接使用fs::remove_dir_all
。只要它工作,我很好。我一直在这里使用它,工作正常,虽然我仍然认为在unix上使用fs::remove_file
和在windows上使用fs::remove_dir
应该是这样的。