120 votes

Comment obtenir la longueur d'un fichier en Go ?

J'ai levé les yeux golang.org/pkg/os/#File mais je n'en ai toujours aucune idée. Il semble qu'il n'y ait aucun moyen d'obtenir la longueur du fichier, ai-je manqué quelque chose ?

Comment obtenir la longueur d'un fichier en Go ?

170voto

Dominik Honnef Points 8050

(*os.File).Stat() renvoie un os.FileInfo qui, à son tour, a une valeur Size() méthode. Ainsi, étant donné un fichier f le code serait semblable à

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

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

124voto

shebaw Points 1365

Si vous ne voulez pas ouvrir le fichier, vous pouvez directement appeler os.Stat à la place.

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

20voto

Lonnie Webb Points 189

Réponse un peu plus verbeuse :

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() )

16voto

alessiosavi Points 310

Appeler os.Stat comme dit par @shebaw (au moins dans les OS UNIX) est plus efficace, car stat() is a Unix system call that returns file attributes about an inode et il n'est pas nécessaire de s'occuper de l'ouverture du fichier.

NOTE : L'utilisation d'une autre méthode peut entraîner too many open files dans une application multithread/concurrence, du fait que vous ouvrez le fichier pour interroger les stats.

Ici, la référence

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X