簡體   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