繁体   English   中英

C++ 在写入文件时获取文件的大小

[英]C++ get the size of a file while it's being written to

我有一个记录应用程序,它从网络流中读取数据并将其写入文件。 它工作得很好,但我想在写入数据时显示文件大小。 gui线程每秒更新状态栏以更新显示的录制时间。 此时我还想显示当前文件大小。

我最初咨询了这个问题并尝试了两种stat方法:

struct stat stat_buf;
int rc = stat(recFilename.c_str(), &stat_buf);
std::cout << recFilename << " " << stat_buf.st_size << "\n";

(为简单起见没有错误检查)和fseek方法:

FILE *p_file = NULL;
p_file = fopen(recFilename.c_str(),"rb");
fseek(p_file,0,SEEK_END);
int size = ftell(p_file);
fclose(p_file);

但无论哪种方式,我的文件大小都为 0。 当我回去查看我写入的文件时,数据在那里并且大小是正确的。 录音发生在一个单独的线程上。

我知道正在写入字节,因为我可以打印数据的大小,因为它与上面显示的方法的输出一起写入。 在此处输入图像描述

文件名加上 0 是我从 GUI 线程打印出来的。 'Byteswritten x' 不在记录线程中。

您可以在此处阅读有关 C++ 文件操作的所有信息http://www.cplusplus.com/doc/tutorial/files/

这是我将如何做的一个例子。

#include <fstream>

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

希望这可以帮助。

作为一种绝望的选择,您可以在“写入数据线程”中使用 ftell 或者使用变量来跟踪写入的数据量,但要解决真正的问题,您一定是犯了一个错误,也许 fopen 永远不会打开文件,或类似的东西。

我将复制一个测试代码以证明这至少在单线程应用程序中有效

int _tmain(int argc, _TCHAR* argv[]) 
{
    FILE * mFile;
    FILE * mFile2;

    mFile = fopen("hi.txt", "a+");

    // fseek(mFile, 0, SEEK_END);

    // @@ this is to make sure that fputs and fwrite works equal
    // fputs("fopen example", mFile);
    fwrite("fopen ex", 1, 9, mFile);

    fseek(mFile, 0, SEEK_END);
    std::cout << ftell(mFile) << ":";

    mFile2 = fopen("hi.txt", "rb");
        fseek(mFile2, 0, SEEK_END);
        std::cout << ftell(mFile2) << std::endl;
   fclose(mFile2);

   fclose(mFile);

   getchar();

   return 0;
}

只需在调用 stat 之前使用 freopen 函数。 似乎 freopen 刷新了文件长度。

我意识到这篇文章在这一点上已经相当老了,但是作为对@TylerD007 的回应,虽然这很有效,但如果你想要做的只是获取写入的字节数,那么这样做的成本非常高。

在 C++17 及更高版本中,您可以简单地使用<filesystem>标头并调用
auto fileSize {std::filesystem::file_size(filePath)}; 现在变量fileSize保存文件的实际大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM