2015-02-05 12 views
6

Làm cách nào để có được tệp inode trong Go?Nhận tệp inode trong Go

Tôi đã có thể in nó như thế này:

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

Nhìn vào thực hiện Go nó là rõ ràng tìm kiếm một số phương pháp stat, nhưng tôi vẫn không quản lý để tìm định nghĩa cấu trúc cho một hệ thống Unix.

Làm cách nào để trực tiếp nhận giá trị inode?

Tệp nào trong mã nguồn xác định cấu trúc của Sys()?

Trả lời

13

Bạn có thể sử dụng một loại khẳng định để có được những syscall.Stat_t tiềm ẩn từ FileInfo như thế này

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

Bỏ qua lỗi khi bạn gọi os.Stat (file) trên đây không phải là một ý tưởng tốt. Đặc biệt khi tệp đang được tìm kiếm có thể thậm chí không có mặt. Bạn có thể nhận được một hoảng loạn thời gian chạy nếu bạn dereference fileinfo mà không kiểm tra. Tôi biết nó chỉ là một ví dụ, nhưng mọi người có thể đi qua này nếu họ sử dụng mô hình trên. –

7

Bạn có thể làm như sau:

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

đâu stat.Ino là inode bạn đang tìm kiếm.

Các vấn đề liên quan