Wie erhalte ich die Dateilänge in Go?

78

Ich habe golang.org/pkg/os/#File nachgeschlagen , habe aber noch keine Ahnung. Es scheint, dass es keine Möglichkeit gibt, die Dateilänge zu ermitteln. Habe ich etwas verpasst?

Wie erhalte ich die Dateilänge in Go?

HardPass
quelle

Antworten:

120

(*os.File).Stat()gibt einen os.FileInfoWert zurück, der wiederum eine Size()Methode hat. Bei einer gegebenen Datei fwäre der Code also ähnlich

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

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

Wenn Sie die Datei nicht öffnen möchten, können Sie os.Statstattdessen direkt aufrufen .

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

Etwas ausführlicher:

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() )
Lonnie Webb
quelle
7
Vielleicht ein defer file.Close()vor dem Stat()?
Timmmm
1
@Timmmm ja - aber da dies ein Code-Snippet ist, können wir nicht davon ausgehen, dass fiio.Reader nicht an anderer Stelle weitergegeben wird, so dass das Schließen möglicherweise anmaßend ist.
colm.anseo
3

Das Aufrufen von os.Stat, wie von @shebaw angegeben (zumindest unter UNIX), ist effizienter, verursacht stat() is a Unix system call that returns file attributes about an inodeund nicht erforderlich, um die Datei zu öffnen.

HINWEIS : Die Verwendung einer anderen Methode kann zu einer Multithread- / Parallelitätsanwendung führen too many open files , da Sie die Datei zum Abfragen der Statistiken öffnen

Hier der Maßstab

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
alessiosavi
quelle