2015-02-05 13 views
6

Come posso ottenere un file inode in Go?Ottieni file inode in Go

ho già riesco a stampare in questo modo:

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

Guardando implementazione Go era ovvio in cerca di qualche metodo stat, ma ancora non sono riuscito a trovare la definizione della struttura di un sistema Unix.

Come posso ottenere direttamente il valore di inode?

Quali file nel codice sorgente definiscono la struttura di Sys()?

risposta

13

è possibile utilizzare un tipo di asserzione per ottenere il sottostante syscall.Stat_t dal fileinfo come questo

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) 
} 
+0

Ignorando l'errore quando si chiama os.stat (file) di cui sopra non è una buona idea. Soprattutto quando il file cercato potrebbe non essere nemmeno presente. È possibile ottenere un panico di runtime se si disinvia fileinfo senza controllo. So che è solo un esempio, ma le persone potrebbero inciampare su questo se usano il modello di cui sopra. –

7

È possibile effettuare le seguenti operazioni:

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

Dove stat.Ino è l'inode che si sta cercando.