为什么stat()调用返回的文件大小的值为零(0)?

时间:2011-11-28 17:37:58

标签: c++ windows visual-c++

我正在运行一个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);

2 个答案:

答案 0 :(得分:1)

一个显着的区别:stat返回系统的文件大小视图; tellg返回一个取决于流的内部状态的值。文件库流被缓冲,在您刷新或关闭文件之前,数据可能不会传递到系统。如果您在调用stat之前使用流的刷新来获得相同的差异吗?

答案 1 :(得分:1)

如果 Larry Osterman 说的是真的,使用GetFileInformationByHandle可能会解决问题。

相关问题