写入文件会产生一个空文件或根本没有文件

writing to file produces an empty file or no file at all

本文关键字:文件 一个      更新时间:2023-10-16

我的GUI运行在一台机器上,该机器应该在发生错误时按下按钮(而不是通过窗口屏幕(关闭。GUI使用CStdioFile对象将错误日志写入文件,然后弹出一个错误窗口,通知用户关闭机器。在某些情况下,windows似乎正在删除该文件,或者该文件在那里,但它是空的。它看起来像是文件被写入RAM而不是硬盘,因为我正在关闭它";残酷地";。我试着补充:int fileLength=myFile.GetLength((;请参阅fileLength获取正确的长度,但即使这样,文件也会被删除/为空。尝试添加myFile.Flush((;以强制系统将文件写入硬盘。仍然不起作用。

我可以做些什么来解决这个问题?

void WriteToErrorLog(CString str, CString traceID)
{
CFileException fileEx;
CFile fileParam;

CString strFilePath = _T("C:/Errors/errors.log");
CStdioFile myFile;
if (myFile.Open(strFilePath, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite))
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Flush();
myFile.Close();
if (myFile.Open(strFilePath,  CFile::modeRead))
{
int fileLength=myFile.GetLength();
myFile.Close();
}
}

来自关于modeCreate标志的CFile文档:

如果不存在文件,则创建一个新文件。如果该文件已经存在,则会覆盖该文件,并且最初将其设置为零长度。

然后对于modeNoTruncate标志:

如果不存在文件,则创建一个新文件;否则,如果该文件已经存在,它将附加到CFile对象。

简而言之,打开文件时不应使用modeCreate标志。

问题不在于modeCreate。正如我所写的,文件是正确创建的,但在关闭机器时被删除了。我似乎发现了问题:之后myFile.Flush((;我补充道FlushFileBuffers(myFile(这使得所有缓冲的数据被写入到文件中。这迫使windows将文件写入磁盘。现在看来效果不错。