Go에서 파일 길이를 얻는 방법은 무엇입니까?


80

나는 고개를 golang.org/pkg/os/#File을 ,하지만 여전히 아무 생각이 없습니다. 파일 길이를 알 수있는 방법이없는 것 같습니다. 내가 놓친 것이 있습니까?

Go에서 파일 길이를 얻는 방법은 무엇입니까?

답변:


126

(*os.File).Stat()os.FileInfo차례로 Size()메서드 가있는 값을 반환합니다 . 따라서 파일이 주어지면 f코드는 다음과 유사합니다.

fi, err := f.Stat()
if err != nil {
  // Could not obtain stat, handle error
}

fmt.Printf("The file is %d bytes long", fi.Size())

68

파일을 열지 않으려면 os.Stat대신 직접 호출 할 수 있습니다 .

fi, err := os.Stat("/path/to/file")
if err != nil {
    return err
}
// get the size
size := fi.Size()

13

약간 더 자세한 답변 :

file, err := os.Open( filepath ) 
if err != nil {
    log.Fatal(err)
}
fi, err := file.Stat()
if err != nil {
    log.Fatal(err)
}
fmt.Println( fi.Size() )

8
아마 defer file.Close()전에 Stat()?
Timmmm

1
@Timmmm 예-그러나 이것은 코드 스 니펫이므로 fiio.Reader가 다른 곳으로 전달되지 않는다고 가정 할 수 없으므로 닫는 것은 주제 넘을 수 있습니다.
colm.anseo apr

3

@shebaw (적어도 UNIX OS에서는)가 말한대로 os.Stat를 호출하는 것이 더 효율적이고 원인 stat() is a Unix system call that returns file attributes about an inode이되며 파일 열기를 처리 할 필요가 없습니다.

참고 : 다른 방법을 사용 too many open files 하면 통계를 쿼리하기 위해 파일을 열었 기 때문에 다중 스레드 / 동시성 응용 프로그램이 발생할 수 있습니다.

여기 벤치 마크

func GetFileSize1(filepath string) (int64, error) {
    fi, err := os.Stat(filepath)
    if err != nil {
        return 0, err
    }
    // get the size
    return fi.Size(), nil
}

func GetFileSize2(filepath string) (int64, error) {
    f, err := os.Open(filepath)
    if err != nil {
        return 0, err
    }
    defer f.Close()
    fi, err := f.Stat()
    if err != nil {
        return 0, err
    }
    return fi.Size(), nil
}
BenchmarkGetFileSize1-8           704618              1662 ns/op
BenchmarkGetFileSize2-8           199461              5668 ns/op
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.