我想使用golang创建一个文件的硬链接。 os.Link()告诉我,不支持windows。 因此我尝试使用os.exec来调用“mklink.exe”。
cmd := exec.Command("mklink.exe", "/H", hardlink_path, file_path)
err := cmd.Run()
然而,它告诉我,它在%PATH%中找不到mklink.exe。 这让我感到困惑,因为我可以使用cmd来调用它。
接下来我试图通过cmd间接调用它:
cmd := exec.Command("cmd.exe", "mklink.exe", "/H", hardlink_path, file_path)
err := cmd.Run()
现在它不会返回任何错误,但是,它也不会创建硬链接。 有什么建议吗?
答案 0 :(得分:7)
Go 1.4中添加了对本机Windows硬链接的Golang支持。具体来说,this commit会使以下代码段起作用:
err := os.Link("original.txt", "link.txt")
请注意并非所有Windows文件系统都支持硬链接。目前为NTFS and UDF support it,但FAT32,exFAT和the newer ReFS do not。
完整的示例代码:
package main
import (
"log"
"os"
"io/ioutil"
)
func main() {
err := ioutil.WriteFile("original.txt", []byte("hello world"), 0600)
if err != nil {
log.Fatalln(err)
}
err = os.Link("original.txt", "link.txt")
if err != nil {
log.Fatalln(err)
}
}
答案 1 :(得分:1)
例如,
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
hardlink_path := `link.hard`
file_path := `link.go`
_, err := os.Stat(file_path)
if err != nil {
fmt.Println(err)
return
}
os.Remove(hardlink_path)
cmd := exec.Command("cmd", "/c", "mklink", "/H", hardlink_path, file_path)
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Println(err)
return
}
fmt.Print(string(out))
}
输出:
Hardlink created for link.hard <<===>> link.go