it-swarm.com.de

Wie kann ich die Dateigröße in C++ ermitteln?

Erstellen Sie eine ergänzende Frage zu this . Wie wird die Dateigröße in C++ am häufigsten ermittelt? Stellen Sie vor dem Beantworten sicher, dass sie portabel ist (möglicherweise ausgeführt unter Unix, Mac und Windows), Zuverlässig, leicht verständlich und ohne Bibliotheksabhängigkeiten (kein Boost oder Qt, aber Glib ist zum Beispiel in Ordnung, da es sich um eine portable Bibliothek handelt).

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

Weitere Informationen zu Dateien in C++ finden Sie unter http://www.cplusplus.com/doc/tutorial/files/ .

139
Spyros

Obwohl nicht unbedingt die populärste Methode, habe ich gehört, dass die ftell, fseek-Methode unter bestimmten Umständen nicht immer genaue Ergebnisse liefert. Wenn eine bereits geöffnete Datei verwendet wird und die Größe daraufhin ermittelt werden muss und sie zufällig als Textdatei geöffnet wird, gibt sie falsche Antworten.

Die folgenden Methoden sollten immer funktionieren, da stat unter Windows, Mac und Linux Bestandteil der Laufzeitbibliothek ist.

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;
}

Auf einigen Systemen gibt es auch stat64/fstat64. Wenn Sie dies für sehr große Dateien benötigen, möchten Sie diese möglicherweise verwenden.

66
Matt

Das kann man auch mit der Funktion fopen (), fseek () und ftell () herausfinden.

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

Verwendung des C++ - Dateisystems 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

In c ++ können Sie die folgende Funktion verwenden. Sie gibt die Größe Ihrer Datei in Byte zurück.

#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

Mit dem folgenden Code-Snippet wird die Frage in diesem .__ genau beantwortet. 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