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?
Antworten:
(*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())
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() )
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 ö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
defer file.Close()
vor demStat()
?