2013-05-28 132 views
4

我想使用golang創建使用硬鏈接到文件。 os.Link()告訴我,不支持windows。 因此我試圖使用os.exec來調用「mklink.exe」。使用golang創建硬鏈接

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

例如,

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

輸出:對原生Windows硬鏈接

Hardlink created for link.hard <<===>> link.go 
4

Golang支持在圍棋1.4增加。具體來說,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) 
    } 
}