如何在Go语言中获取文件 inode?
我已经可以像这样打印它:
file := "/tmp/system.log"
fileinfo, _ := os.Stat(file)
fmt.Println(fileinfo.Sys())
fmt.Println(fileinfo)
查看Go实现代码,很明显需要寻找stat
方法,但我仍未能找到Unix系统结构的定义。
如何直接获取inode值?
源代码中哪个或哪些文件定义了Sys()
的结构?
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)
}
你可以做以下事情:
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。
Package syscall现已被弃用。请参见https://pkg.go.dev/golang.org/x/sys。
stat, ok := fileinfo.Sys().(*syscall.Stat_t)
这行代码实际上是做什么的?根据fmt.Printf("%T", fileinfo.Sys())
,fileinfo.Sys()
返回一个 *syscall.Stat_t。希望能够提供一些解释。 - Brettskifileinfo.Sys()
会返回一个interface{}
值,可能是nil
,它捕获了底层系统调用中os.Stat()
的结果。stat, ok := fileinfo.Sys().(*syscall.Stat_t)
这一行是一个类型断言,它表示我认为这个接口值里面是一个*syscall.Stat_t
。如果是的话,就让我拿到它,并将变量ok
设置为true
。 如果ok
为真,则stat
现在有了您期望的指针(如果!ok,则stat
为nil),您现在可以使用stat.Ino
和其他类似的字段。 - torekos.(* Fileinfo).Stat()
返回“任何类型”的值——interface {}
:返回值的确切(动态)类型是特定于操作系统的,程序员需要断言其真实类型以获得正确类型的值。 - kostixos.(*FileInfo).Sys()
返回*syscall.Win32FileAttributeData
——您可以通过运行$ GOOS=windows go doc syscall.Win32FileAttributeData
来了解它。 - kostix