2015-02-05 13 views
6

Jak mogę uzyskać i-węzeł pliku w Go?Pobierz i-węzeł pliku w Go

I już można wydrukować go tak:

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

Patrząc na realizację Go było oczywiste, patrząc na niektóre stat metody, ale nadal nie udało się odnaleźć definicję struktury dla systemu Unix.

Jak mogę uzyskać wartość i-węzła bezpośrednio?

Które pliki w kodzie źródłowym określają strukturę Sys()?

Odpowiedz

13

Można użyć typu twierdzenie uzyskać stanowiącego podstawę syscall.Stat_t z FileInfo jak ten

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

Pomijając błąd podczas wywoływania os.Stat (plik) powyżej, nie jest dobrym pomysłem. Zwłaszcza gdy szukany plik może nawet nie być obecny. Możesz uzyskać panikę uruchomieniową, jeśli usuniesz plik infoinfo bez sprawdzania. Wiem, że to tylko przykład, ale ludzie mogą się o to potknąć, jeśli użyją powyższego modelu. –

7

można wykonać następujące czynności:

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

Gdzie stat.Ino jest iwęzeł szukasz.