我正在运行一个windows c ++多线程应用程序,其中服务器类的一个实例/线程附加到该文件。其他线程运行仅加载文件的客户端实例 每个客户的创业公司。 当我到达加载文件结束的2k字节内时,我检查文件是否已更改 在大小,所以我知道更新要读取的总字节数。偶尔文件大小 我回来被错误地确定为零(0)。我正在使用下面的stat调用。当返回零时,然后作为完整性检查,然后我调用getFileSizeWithTellg()来查看它返回的内容并返回预期的非零值。与初始值相同或更大的值。 我意识到转换为unsigned int可能会有问题,但文件永远不会 大于5 mgBytes。
当.Tellg调用没有时,可能导致stat()调用返回零值的原因是什么? 感谢您对此的任何见解。
/
/ 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);
答案 0 :(得分:1)
一个显着的区别:stat
返回系统的文件大小视图; tellg
返回一个取决于流的内部状态的值。文件库流被缓冲,在您刷新或关闭文件之前,数据可能不会传递到系统。如果您在调用stat
之前使用流的刷新来获得相同的差异吗?
答案 1 :(得分:1)
如果 Larry Osterman 说的是真的,使用GetFileInformationByHandle可能会解决问题。