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

时间:2011-04-30 06:55:49

标签: c++ filesize

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

7 个答案:

答案 0 :(得分:143)

#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/

答案 1 :(得分:67)

虽然不一定是最受欢迎的方法,但我听说ftell,fseek方法在某些情况下可能并不总能给出准确的结果。具体来说,如果使用已经打开的文件并且需要对其进行处理并且它恰好作为文本文件打开,那么它将给出错误的答案。

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

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

在某些系统上还有一个stat64 / fstat64。因此,如果你需要这个非常大的文件,你可能想看看使用它们。

答案 2 :(得分:23)

也可以使用fopen(),fseek()和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;
}

答案 3 :(得分:23)

使用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";
}

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

  

下面的代码段正好解决了这个问题   发布:))

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