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