如何在c++中获取文件的大小?(复制)

时间:2022-09-06 08:11:47

This question already has an answer here:

这个问题已经有了答案:

Let's create a complementary question to this one. What is the most common way to get the file size in C++? Before answering, make sure it is portable (may be executed on Unix, Mac and Windows), reliable, easy to understand and without library dependencies (no boost or qt, but for instance glib is ok since it is portable library).

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

7 个解决方案

#1


128  

#include <fstream>

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

See http://www.cplusplus.com/doc/tutorial/files/ for more information on files in C++.

请参阅http://www.cplusplus.com/doc/tutorial/files/以获得更多关于c++文件的信息。

#2


57  

While not necessarily the most popular method, I've heard that the ftell, fseek method may not always give accurate results in some circumstances. Specifically, if an already opened file is used and the size needs to be worked out on that and it happens to be opened as a text file, then it's going to give out wrong answers.

虽然不一定是最流行的方法,但我听说ftell, fseek方法在某些情况下不一定能给出准确的结果。具体来说,如果一个已经打开的文件被使用了,并且这个大小需要被计算出来,并且它碰巧被打开作为一个文本文件,那么它就会给出错误的答案。

The following methods should always work as stat is part of the c runtime library on Windows, Mac and Linux.

下面的方法应该一直工作,因为它是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;
}

On some systems there is also a stat64/fstat64. So if you need this for very large files you may want to look at using those.

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

#3


22  

It is also possible to find that out using the fopen(),fseek() and ftell() function.

还可以使用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;
}

#4


19  

Using the C++ filesystem TS:

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

#5


1  

In c++ you can use following function, it will return the size of you file in bytes.

在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


1  

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

#7


-1  

The code snippet below exactly addresses the question in this 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;
}

#1


128  

#include <fstream>

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

See http://www.cplusplus.com/doc/tutorial/files/ for more information on files in C++.

请参阅http://www.cplusplus.com/doc/tutorial/files/以获得更多关于c++文件的信息。

#2


57  

While not necessarily the most popular method, I've heard that the ftell, fseek method may not always give accurate results in some circumstances. Specifically, if an already opened file is used and the size needs to be worked out on that and it happens to be opened as a text file, then it's going to give out wrong answers.

虽然不一定是最流行的方法,但我听说ftell, fseek方法在某些情况下不一定能给出准确的结果。具体来说,如果一个已经打开的文件被使用了,并且这个大小需要被计算出来,并且它碰巧被打开作为一个文本文件,那么它就会给出错误的答案。

The following methods should always work as stat is part of the c runtime library on Windows, Mac and Linux.

下面的方法应该一直工作,因为它是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;
}

On some systems there is also a stat64/fstat64. So if you need this for very large files you may want to look at using those.

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

#3


22  

It is also possible to find that out using the fopen(),fseek() and ftell() function.

还可以使用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;
}

#4


19  

Using the C++ filesystem TS:

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

#5


1  

In c++ you can use following function, it will return the size of you file in bytes.

在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


1  

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

#7


-1  

The code snippet below exactly addresses the question in this 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;
}