2015-02-05 5 views
6

Как я могу получить файл inode в Go?Получить файл inode в Go

Я уже могу печатать это следующим образом:

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

Глядя на реализацию Go это было очевидно, ищет некоторые stat метод, но я до сих пор не удалось найти определение структуры для системы Unix.

Как я могу получить значение inode напрямую?

Какие файлы/ы в исходном коде определяют структуру Sys()?

ответ

13

Вы можете использовать тип утверждения, чтобы получить лежащий в основе syscall.Stat_t от FileInfo как этот

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

Игнорирование ошибки при вызове os.stat (файл) выше, не является хорошей идеей. В частности, когда поиск файла может даже не присутствовать. Вы можете получить панику при запуске, если вы не производите разметку fileinfo без проверки. Я знаю, что это всего лишь пример, но люди могут это преодолеть, если они используют вышеупомянутую модель. –

7

Вы можете сделать следующее:

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 это индексный дескриптор вы ищете.

Смежные вопросы