【问题标题】:Get file inode in Go在 Go 中获取文件 inode
【发布时间】:2015-04-05 00:42:12
【问题描述】:

如何在 Go 中获取文件 inode?​​p>

我已经可以这样打印了:

file := "/tmp/system.log"
fileinfo, _ := os.Stat(file)
fmt.Println(fileinfo.Sys())
fmt.Println(fileinfo)

查看 Go 实现,很明显在寻找一些 stat 方法,但我仍然没有设法找到 Unix 系统的结构定义。

如何直接获取inode值?

源码中哪个文件/s定义了Sys()的结构?

【问题讨论】:

    标签: unix go inode


    【解决方案1】:

    您可以像这样使用类型断言从文件信息中获取底层syscall.Stat_t

    package main
    
    import (
        "fmt"
        "os"
        "syscall"
    )
    
    func main() {
        file := "/etc/passwd"
        fileinfo, _ := os.Stat(file)
        fmt.Printf("fileinfo.Sys() = %#v\n", fileinfo.Sys())
        fmt.Printf("fileinfo = %#v\n", fileinfo)
        stat, ok := fileinfo.Sys().(*syscall.Stat_t)
        if !ok {
            fmt.Printf("Not a syscall.Stat_t")
            return
        }
        fmt.Printf("stat = %#v\n", stat)
        fmt.Printf("stat.Ino = %#v\n", stat.Ino)
    }
    

    【讨论】:

    • 在调用上面的 os.Stat(file) 时忽略错误不是一个好主意。特别是当正在搜索的文件甚至可能不存在时。如果您在不检查的情况下取消引用 fileinfo,您可能会出现运行时恐慌。我知道这只是一个例子,但如果他们使用上述模型,人们可能会绊倒。
    • 行,stat, ok := fileinfo.Sys().(*syscall.Stat_t) 实际上是做什么的? fileinfo.Sys() 根据fmt.Printf("%T", fileinfo.Sys()) 返回一个 *syscall.Stat_t 一些清晰会非常有帮助
    • @Brettski: fileinfo.Sys() 为您获取一个interface{} 值——可能是nil——它捕获了os.Stat() 调用从底层系统调用中得到的任何内容。 stat, ok := fileinfo.Sys().(*syscall.Stat_t) 行是一个类型断言,它表示我认为这个接口值中的内容是*syscall.Stat_t。如果是这样,让我拥有它,并将变量 ok 设置为 true 如果 ok 为真,stat 现在有您期望的指针(如果!ok,stat 为 nil ) 并且您现在可以使用stat.Ino 和其他此类字段。
    • @Brettski,扩展 @torek 所说的:在与操作系统交互时,Go 必须在两个相互排斥的要求之间取得平衡:一方面,它在 stdlib 中提供的 API 应该努力要 100% 同质化(跨平台),另一方面,程序员通常需要掌握具体的平台特定细节。这就是为什么os.(*Fileinfo).Stat() 返回一个“任何类型”的值—interface{}:返回值的确切(动态)类型是特定于操作系统的,程序员需要断言它的真实类型获取正确类型的值。
    • @Brettski,例如,我相信,在 Windows 上 os.(*FileInfo).Sys() 返回 *syscall.Win32FileAttributeData——你可以通过运行 $ GOOS=windows go doc syscall.Win32FileAttributeData 来了解它。
    【解决方案2】:

    您可以执行以下操作:

    file := "/tmp/system.log"
    var stat syscall.Stat_t
    if err := syscall.Stat(file, &stat); err != nil {
        panic(err)
    }
    fmt.Println(stat.Ino)
    

    stat.Ino 是您要查找的 inode。

    【讨论】:

      【解决方案3】:

      现在不推荐使用包系统调用。请参阅https://pkg.go.dev/golang.org/x/sys

      【讨论】:

        猜你喜欢
        • 2016-02-01
        • 2017-08-27
        • 2017-04-14
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2012-04-15
        • 2013-08-05
        • 2011-12-20
        相关资源
        最近更新 更多