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?
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?
(*os.File).Stat()
gibt einen os.FileInfo
Wert zurück, der wiederum eine Size()
Methode hat. Bei einer gegebenen Datei f
wä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())
Wenn Sie die Datei nicht öffnen möchten, können Sie os.Stat
stattdessen direkt aufrufen .
fi, err := os.Stat("/path/to/file")
if err != nil {
return err
}
// get the size
size := fi.Size()
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() )
defer file.Close()
vor demStat()
?fi
io.Reader nicht an anderer Stelle weitergegeben wird, so dass das Schließen möglicherweise anmaßend ist.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 inode
und 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 öffnenHier 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
quelle