检查文件是否为硬链接

在 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())


白板的微信
浏览 213回答 3
3回答

桃花长相依

术语“硬链接”有点用词不当。文件在大多数文件系统中的工作方式是给定的文件(由路径标识的东西,如/foo)实际上只是一个指向称为“inode”的结构的指针。索引节点是磁盘上实际代表文件内容和元数据的结构。当一个文件是另一个文件的“硬链接”时,它只是意味着它们都指向同一个 inode。系统将跟踪指向给定 inode 的文件数量,并确保在删除所有指向它的文件之前不要删除该 inode。因此,“这个文件是硬链接吗”这个问题没有意义。什么是有意义的问题,“这两个文件是否彼此硬链接”,或者更准确地说,“这两个文件是否指向同一个 inode”。如果你想在 Go 中回答这个问题,你只需要os.SameFile。

素胚勾勒不出你

文件是 inode 的硬链接,你可以有多个 inode 的硬链接,文件系统不会区分它们。如果您有两个文件指向磁盘上的同一个 inode 并删除一个文件,则该文件仍将存在。只有在删除所有指向 inode 的链接后,文件系统才会回收空间。您可以使用它ls -i来确定索引,并计算stats <path to file>出文件系统中有多少指向 inode 的链接。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go