在 Go 中如何检查文件是否为硬链接?os.FileMode只有符号链接模式,没有硬链接。
不幸的是,我有一个想法行不通:
package main
func main() {
filename := os.Args[1]
var hardlink bool
link, _ := os.Readlink(filename)
fi, _ := os.Stat(filename)
mode := string(fi.Mode().String()[0])
if link != "" && mode != "L" {
hardlink = true
}
fmt.Printf("%v is hard link? %v\n", filename, hardlink)
}
这 ^ 不起作用,因为os.Readlink只读取符号链接,而不是硬链接。
我发现了一个有点相关的答案:
计数硬链接在Go文件
,但这个答案显示了如何找到数的硬链接到一个文件,而不是是否一个文件本身的硬链接。
我猜那个答案中使用的syscall包,或者更好的是,sys包有一种方法来测试文件是否是硬链接。有谁知道要这样做吗?(我很难理解这些包,因为它们太低级了。)
编辑
我应该添加我想检查这个的原因。我正在尝试创建一个函数来创建目录的 tar 存档 [使用filepath.Walk()]。在这个函数中,当我*tar.Header为一个文件创建 时,我将一个值设置为*tar.Header.Typeflag.
例如,如果fi是一个文件的*os.FileInfo变量,并且hdr是该*tar.Header文件在新 tar 存档中的位置的变量,则它看起来像这样:
if fi.Mode().IsDir() {
hdr.Typeflag = tar.TypeDir
}
在tar包中,硬链接和常规文件的模式是不同的,TypeLinkand TypeReg,但在os包中并非如此。所以运行它不会设置正确的Typeflag:
hdr.Mode = int64(fi.Mode())
桃花长相依
素胚勾勒不出你
相关分类