8

我想使用 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()

现在它不会返回任何错误,但是,它也不会创建硬链接。有什么建议么?

4

2 回答 2

12

Go 1.4 中添加了对原生 Windows 硬链接的 Golang 支持。具体来说,此提交使以下代码段起作用:

err := os.Link("original.txt", "link.txt")

请注意,并非所有 Windows 文件系统都支持硬链接。目前NTFS 和 UDF 支持它,但 FAT32、exFAT 和较新的 ReFS 不支持。

完整示例代码:

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)
    }
}
于 2015-11-27T17:31:48.063 回答
0

例如,

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
于 2013-05-29T01:11:02.007 回答