读取并处理一个大的文本文件(超过2GB),因为耗时较长,需要在界面上显示一个进度条。
为了显示进度条,就应该取得文件本身的大小,取得文件大小共有两种方法。
但是发现一个很诡异的现象,只要取大小,运行必然出错。
说明:以下示例代码中的变量都是有明确含义的(比如有实际的文件名等等)。这里只是简化了取得实际文件名的那些对分析问题没有什么帮助的代码。
情况一,下面的代码执行到 file.GetLength() 这儿就会出错,说“一个无效的句柄关联到——文件”。
有人可能会说,你的文件没打开。对不起,文件打开是成功的(两个方法验证过:1、在 file.Open(fileName,CFile::modeRead) 之后调用 GetLastError() 的返回值证明文件是打开了的。2、去掉 file.GetLength() 语句之后,读取文件内容直到结束都正常了)
CString fileName;
CStdioFile file;
ULONGLONG nLength;
// Other codes
file.Open(fileName,CFile::modeRead);
nLength =file.GetLength();
AfxBeginThread(TreatData,(LPVOID)this);
情况二,换一种读取文件大小的方式。可以成功启动辅助线程。辅助线程负责读取文件内容,当文件内容读取到大约70%的时候,程序崩溃了。
CString fileName;
CStdioFile file;
ULONGLONG nLength;
CFileStatus sat;
// Other codes
file.Open(fileName,CFile::modeRead);
file.GetStatus(sat);
nLength = sat.m_size;
AfxBeginThread(TreatData,(LPVOID)this);
把问题归纳一下:
1)上述代码读取小文件没问题
2)只要不读取文件大小(去掉相应的语句),读取大文件也没问题
3)代码一、读取文件大小出错
4)代码二、文件没有全部读取,程序就崩溃。
本人百思不得其解。根据上面的1)、3)、4),感觉被操作的大文件有问题,但是联想到2),大文件应该没问题
还有,3)、4),只是换一种读取文件大小的方法(都是微软自己的方法),结果还不一样。
平台是VC2003