如何在 C + + 中获得文件的大小?

让我们为 这个创建一个补充问题。 在 C + + 中获得文件大小最常用的方法是什么? 在回答之前,确保它是可移植的(可以在 Unix,Mac 和 Windows 上执行) , 可靠,易于理解,而且没有库依赖性(没有升级或 qt,但是例如 glib 是可移植的库)。

360853 次浏览
#include <fstream>


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

有关 C + + 中文件的更多信息,请参见 http://www.cplusplus.com/doc/tutorial/files/

编辑: 这个答案是不正确的,因为 tellg ()不一定返回正确的值。参见 http://stackoverflow.com/a/22986486/1835769

还可以使用 fopen ()、 ffind ()和 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;
}

虽然不一定是最流行的方法,但我听说在某些情况下,ftell,ffind 方法可能并不总是给出准确的结果。具体来说,如果使用了一个已经打开的文件,并且需要计算该文件的大小,而该文件恰好是以文本文件的形式打开的,那么它将会给出错误的答案。

以下方法应该始终工作,因为 stat 是 Windows、 Mac 和 Linux 上 c 运行时库的一部分。

#include <sys/stat.h>


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

如果对于非常大的文件(> 2GB)需要这个函数,可以调用 stat64fstat64

在 c + + 中,可以使用以下函数,它将返回文件的大小(以字节为单位)。

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

使用 C + + 文件系统库:

#include <filesystem>


int main(int argc, char *argv[]) {
std::filesystem::path p{argv[1]};


std::cout << "The size of " << p.u8string() << " is " <<
std::filesystem::file_size(p) << " bytes.\n";
}
#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);
}

下面的代码片段正好解决了这个问题 邮寄:)

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