Tragbare Weise Dateigröße in C / C ++ zu erhalten
-
19-09-2019 - |
Frage
Ich brauche die Byte-Größe einer Datei determin.
Die Codierung Sprache ist C ++ und der Code sollte mit Linux, Windows und anderen Betriebssystemen arbeiten. Dies bedeutet, unter Verwendung von Standard-C oder C ++ Funktionen / Klassen.
Diese trivial Notwendigkeit hat anscheinend keine triviale Lösung.
Lösung
Mit std Stream können Sie:
std::ifstream ifile(....);
ifile.seekg(0, std::ios_base::end);//seek to end
//now get current position as length of file
ifile.tellg();
Wenn Sie mit Schreib behandeln nur Datei (std :: ofstream), dann Methoden sind einige andere:
ofile.seekp(0, std::ios_base::end);
ofile.tellp();
Andere Tipps
Sie können stat Systemaufruf verwendet werden:
#ifdef WIN32
_stat64()
#else
stat64()
Wenn Sie nur die Dateigröße dies sicherlich übertrieben, aber im Allgemeinen würde ich mit Boost.Filesystem für plattformunabhängige Dateioperationen. Unter anderem Attribute Funktionen enthält es
template <class Path> uintmax_t file_size(const Path& p);
Sie können die Referenz hier . Obwohl Boost-Bibliotheken können riesige scheinen fand ich es oft, die Dinge umzusetzen sehr effizient. Sie könnten auch nur die Funktion extrahieren Sie brauchen, aber dies könnte Beweis schwierig, wie Boost-recht komplex ist.
Simples:
std::ifstream ifs;
ifs.open("mybigfile.txt", std::ios::bin);
ifs.seekg(0, std::ios::end);
std::fpos pos = ifs.tellg();
Oft wollen wir die Dinge in der meisten tragbaren Weise getan, aber in bestimmten Situationen, vor allem wie diese, würde ich stark mit System-APIs für die beste Leistung empfehlen.
Portabilität erfordert, dass Sie den kleinsten gemeinsamen Nenner zu verwenden, die C wäre (nicht c ++) Die Methode, die ich benutze, ist die folgende.
#include <stdio.h>
long filesize(const char *filename)
{
FILE *f = fopen(filename,"rb"); /* open the file in read only */
long size = 0;
if (fseek(f,0,SEEK_END)==0) /* seek was successful */
size = ftell(f);
fclose(f);
return size;
}