2015-02-05 2 views
6

Go에서 파일 inode를 얻으려면 어떻게해야합니까? go에서 파일 inode 가져 오기

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

가 일부 stat 방법을 찾고 명백했다 이동 구현을 보면,하지만, 난 여전히 유닉스 시스템에 대한 구조 정의를 찾기 위해 관리하지 않았다

이미 다음과 같이 인쇄 할 수 있습니다.

어떻게 inode 값을 직접 가져올 수 있습니까?

소스 코드의 어떤 파일이 Sys() 구조를 정의합니까?

답변

13

당신은 당신이 os.Stat (파일)을 호출 할 때 좋은 생각이 아니다 위의 오류를 무시이

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

것처럼에서는 FileInfo에서 기본 syscall.Stat_t을 얻을 수있는 유형의 주장을 사용할 수 있습니다. 특히 검색 할 파일이 없을 수도 있습니다. 검사하지 않고 fileinfo를 역 참조하면 런타임 패닉이 발생할 수 있습니다. 나는 그것이 단지 예일 뿐이라는 것을 알고 있지만, 위의 모델을 사용한다면 사람들은 이걸 넘어갈 것입니다. –

7

당신은 다음과 같은 작업을 수행 할 수

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) 

.