MFC写文件时,打开写入位置文件夹,或者刷新文件夹里的内容,就会引起中断。
我的代码如下:
CString savepath("E:\测试文件夹");
CreateDirectory(savepath,NULL);
CString filename("\test.txt");
filename = savepath + filename;
CString str;
str =_T("test2016test2016test2016test2016test2016\r\n");
CStdioFile myFile;
CFileException fileException;
while(1)
{
Sleep(1);
if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone),&fileException;)
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}
else
{
MessageBox(_T("打开文件失败"));
}
}
文件循环写入的图中,以下情况会偶尔引起中断
1,打开“测试文件夹”
2,在“测试文件夹”里按F5刷新,
3,复制test.txt文件。
4,打开test.txt文件。
当文件越来越大的时候,这样的操作引起中断更容易。
中断位置指向WriteString(str);
请问各位大神,怎么处理?哪里操作不够安全?
你是不是逻辑错了? !myFile.Open的意思是:打开失败!此时你失败了还writeString肯定会引起中断!
if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone),&fileException;)
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}
else
{
MessageBox(_T("打开文件失败"));
}
代码中的,&fileException(没有分号,上面多打了。)位置放错了!导致if语句一直执行。这时候打开失败也能进入写分支。else分支一直没有用到。
原因:代码是抄别人的,没留意if里的判断。
修改方案:删除&fileException(我不太清楚它的作用)。调整if语句的判断如下,并更改写入逻辑。
if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone))
{
MessageBox(_T("打开文件失败,文件被占用"));
}
else
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}
你while(1)的时候,在内部打开了文件,但是你if判断逻辑错误,然后文件就一直开着!因为文件打开成功了,到了else分支,while运行第二次后,你打开失败,因为前一次打开了,然后到了if的!open分支,你往里面写数据,然后close
接着while继续……现在你明白吧