用golang创建Hardlink

时间:2013-05-28 19:36:56

标签: windows go hardlink

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

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

2 个答案:

答案 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