Pergunta

I want to create a hardlink to a file using golang. os.Link() tells me, that windows is not supported. Therefore i tried to use os.exec, to call "mklink.exe".

cmd := exec.Command("mklink.exe", "/H", hardlink_path, file_path)
err := cmd.Run()

However, it tells me, that it can't find mklink.exe in %PATH%. This baffels me, since i can call it using cmd.

Next i tried to call it indirectly via cmd:

cmd := exec.Command("cmd.exe", "mklink.exe", "/H", hardlink_path, file_path)
err := cmd.Run()

Now it does not return any error, however, it also doesn't create a hardlink. Any suggestions?

Foi útil?

Solução

Golang support for native Windows hard links was added in Go 1.4. Specifically, this commit makes the following snippet work:

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

Beware that not all Windows file systems support hard links. Currently NTFS and UDF support it, but FAT32, exFAT and the newer ReFS do not.

Full example code:

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)
    }
}

Outras dicas

For example,

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))
}

Output:

Hardlink created for link.hard <<===>> link.go
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top