为了账号安全,请及时绑定邮箱和手机立即绑定

检查文件是否为硬链接

检查文件是否为硬链接

Go
白板的微信 2021-11-01 10:31:49
在 Go 中如何检查文件是否为硬链接?os.FileMode只有符号链接模式,没有硬链接。不幸的是,我有一个想法行不通:package mainfunc 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())
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

术语“硬链接”有点用词不当。文件在大多数文件系统中的工作方式是给定的文件(由路径标识的东西,如/foo)实际上只是一个指向称为“inode”的结构的指针。索引节点是磁盘上实际代表文件内容和元数据的结构。当一个文件是另一个文件的“硬链接”时,它只是意味着它们都指向同一个 inode。系统将跟踪指向给定 inode 的文件数量,并确保在删除所有指向它的文件之前不要删除该 inode。

因此,“这个文件是硬链接吗”这个问题没有意义。什么有意义的问题,“这两个文件是否彼此硬链接”,或者更准确地说,“这两个文件是否指向同一个 inode”。如果你想在 Go 中回答这个问题,你只需要os.SameFile


查看完整回答
反对 回复 2021-11-01
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

文件是 inode 的硬链接,你可以有多个 inode 的硬链接,文件系统不会区分它们。如果您有两个文件指向磁盘上的同一个 inode 并删除一个文件,则该文件仍将存在。只有在删除所有指向 inode 的链接后,文件系统才会回收空间。

您可以使用它ls -i来确定索引,并计算stats <path to file>出文件系统中有多少指向 inode 的链接。


查看完整回答
反对 回复 2021-11-01
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信