[英]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.