web-dev-qa-db-fra.com

Comment puis-je obtenir la taille d'un fichier en C++?

Créons une question complémentaire à celle-ci . Quel est le moyen le plus courant d’obtenir la taille du fichier en C++? Avant de répondre, assurez-vous qu’il est portable (il peut être exécuté sous Unix, Mac et Windows), Fiable, facile à comprendre et sans dépendances de bibliothèque (pas de boost ni de qt, mais par exemple, glib est ok puisqu'il s'agit d'une bibliothèque portable).

113
Sophie Sperner
#include <fstream>

std::ifstream::pos_type filesize(const char* filename)
{
    std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary);
    return in.tellg(); 
}

Voir http://www.cplusplus.com/doc/tutorial/files/ pour plus d'informations sur les fichiers en C++.

139
Spyros

Bien que ce ne soit pas nécessairement la méthode la plus populaire, j’ai entendu dire que la méthode ftell, fseek peut ne pas toujours donner des résultats précis dans certaines circonstances. En particulier, si un fichier déjà ouvert est utilisé et que sa taille doit être réglée et que le fichier texte est ouvert, il donnera des réponses erronées.

Les méthodes suivantes doivent toujours fonctionner, car stat fait partie de la bibliothèque d'exécution c sous Windows, Mac et Linux.

long GetFileSize(std::string filename)
{
    struct stat stat_buf;
    int rc = stat(filename.c_str(), &stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;
}

or 

long FdGetFileSize(int fd)
{
    struct stat stat_buf;
    int rc = fstat(fd, &stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;
}

Sur certains systèmes, il existe également un stat64/fstat64. Donc, si vous en avez besoin pour de très gros fichiers, vous pouvez envisager de les utiliser.

66
Matt

Il est également possible de le savoir en utilisant les fonctions fopen (), fseek () et ftell ().

int get_file_size(std::string filename) // path to file
{
    FILE *p_file = NULL;
    p_file = fopen(filename.c_str(),"rb");
    fseek(p_file,0,SEEK_END);
    int size = ftell(p_file);
    fclose(p_file);
    return size;
}
23
Andro

Utilisation du système de fichiers C++ TS:

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

int main(int argc, char *argv[]) {
  fs::path p{argv[1]};
  p = fs::canonical(p);

  std::cout << "The size of " << p.u8string() << " is " <<
      fs::file_size(p) << " bytes.\n";
}
22
bames53
#include <stdio.h>
int main()
{
    FILE *f;
    f = fopen("mainfinal.c" , "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    printf("%ld\n", len);
    fclose(f);
}
2
Sharon Joseph

En c ++, vous pouvez utiliser la fonction suivante, elle retournera la taille de votre fichier en octets.

#include <fstream>

int fileSize(const char *add){
    ifstream mySource;
    mySource.open(add, ios_base::binary);
    mySource.seekg(0,ios_base::end);
    int size = mySource.tellg();
    mySource.close();
    return size;
}
1
Hadi Rasekh

L'extrait de code ci-dessous répond exactement à la question de ce post :)

///
/// Get me my file size in bytes (long long to support any file size supported by your OS.
///
long long Logger::getFileSize()
{
    std::streampos fsize = 0;

    std::ifstream myfile ("myfile.txt", ios::in);  // File is of type const char*

    fsize = myfile.tellg();         // The file pointer is currently at the beginning
    myfile.seekg(0, ios::end);      // Place the file pointer at the end of file

    fsize = myfile.tellg() - fsize;
    myfile.close();

    static_assert(sizeof(fsize) >= sizeof(long long), "Oops.");

    cout << "size is: " << fsize << " bytes.\n";
    return fsize;
}
0
Sammy