为什么stat()调用会为文件大小返回不正确的零(0)值? 我正在运行一个Windows C++多线程应用程序,其中一个实例/线程的服务器类正在追加到文件中。其他线程运行客户端实例,这些实例仅在 每个客户端的启动。 当我到达加载文件结束后2k字节内时,我会检查文件是否已更改 在大小上,所以我知道要更新读取的总字节数。偶尔会改变文件大小 I get back被错误地确定为零(0)。我正在使用下面的统计调用。当返回零时,作为一个健全性检查,我然后调用getFileSizeWithTellg()查看它返回的内容,以及它返回的预期非零值。等于或大于初始值的值。 我意识到转换为unsigned int可能会有问题,但文件永远不会有问题 大于5兆字节

为什么stat()调用会为文件大小返回不正确的零(0)值? 我正在运行一个Windows C++多线程应用程序,其中一个实例/线程的服务器类正在追加到文件中。其他线程运行客户端实例,这些实例仅在 每个客户端的启动。 当我到达加载文件结束后2k字节内时,我会检查文件是否已更改 在大小上,所以我知道要更新读取的总字节数。偶尔会改变文件大小 I get back被错误地确定为零(0)。我正在使用下面的统计调用。当返回零时,作为一个健全性检查,我然后调用getFileSizeWithTellg()查看它返回的内容,以及它返回的预期非零值。等于或大于初始值的值。 我意识到转换为unsigned int可能会有问题,但文件永远不会有问题 大于5兆字节,c++,windows,visual-c++,C++,Windows,Visual C++,当..Tellg调用不返回零值时,是什么导致stat()调用返回零值? 谢谢你对这方面的了解 / 一个显著的区别是:stat返回系统对文件大小的视图tellg返回一个依赖于流内部状态的值。文件基流被缓冲,在刷新或关闭文件之前,数据可能不会传递到系统。如果在调用stat之前刷新流,是否会得到相同的差异?如果拉里·奥斯特曼所说的是真的,那么使用可能会解决问题。更具体一点:stat()调用返回FindFirstFileEx返回的文件大小-在关闭文件之前,此信息不可靠。它是相当随机的。但我没有在写完信后

当..Tellg调用不返回零值时,是什么导致stat()调用返回零值? 谢谢你对这方面的了解

/


一个显著的区别是:
stat
返回系统对文件大小的视图
tellg
返回一个依赖于流内部状态的值。文件基流被缓冲,在刷新或关闭文件之前,数据可能不会传递到系统。如果在调用
stat
之前刷新流,是否会得到相同的差异?

如果拉里·奥斯特曼所说的是真的,那么使用可能会解决问题。

更具体一点:stat()调用返回FindFirstFileEx返回的文件大小-在关闭文件之前,此信息不可靠。它是相当随机的。但我没有在写完信后脸红。但现在我是。此外,在加载开始时,我使用tellg。当我接近尾声时,我使用stat,因为它不会改变文件指针的位置,而我需要移动到文件的ed,然后调用tellg并重新定位到我所在的位置,这只是多一点代码。但这可能是一条路要走。这与每次写入线程后的刷新相结合,应该可以正常工作。正确吗?如果您需要关于文件状态的准确信息,并且您拥有文件句柄,请调用使用句柄的API,而不是使用文件名的API。通常,使用文件名的API不如使用句柄的API准确(句柄将始终反映文件状态的最新文件系统度量)。@LarryOsterman如果名称引用同一个文件,则应该没有区别。@AlKurlansky If
tellg
起作用,那你就不需要冲洗了;
tellg
是否为您提供有用的东西取决于实现(但如果您使用的是
stat
,则您已经依赖于实现)<当然,code>stat只报告系统实际输出的字节,因此需要刷新。一个比这两个更好的系统可能是安装一个过滤streambuf,它计算发送给它的字节数。您或其他任何人都可以通过检查MSVS安装目录中的某个位置来验证Osterman先生说的确实是真话。使用GetFileInformationByHandle的一个小警告-我相信这需要打开文件以访问文件查询信息-如果打开文件以进行常规读取,则不会出现问题,但如果仅打开文件以进行常规写入,则不会出现问题。
/ snippets from methods in different classes
//
// from client class
ifstream fileSeqIn
fileSeqIn.open(fName.c_str(), ios::in | ios::binary |ios::ate); 
// to get initial size
size = fileSeqIn.tellg();
fileSeqIn.seekg(0, ios::beg);


// later to determine if the file has grown
struct stat filestatus;
unsigned int size;
if (stat(fName, &filestatus ) == 0) {
     size = (unsigned int)filestatus.st_size;   
}

//
unsigned int getFileSizeWithTellg(char *fname)
{
    // get length of file
    is.open (fname, ios::binary );
    is.seekg (0, ios::end); 
    length = is.tellg();
    is.close();
    return(length);
}


//-----------------------------------------------------------------------------
// from server class
ofstream fileSeqOut;
fileSeqOut.open(fName.c_str(), ios::app | ios::out |ios::ate |ios::binary);