【问题标题】:writing to file produces an empty file or no file at all写入文件会产生一个空文件或根本没有文件
【发布时间】:2020-07-08 11:27:28
【问题描述】:

我的 GUI 在一台机器上运行,如果发生错误,该机器应该按其按钮(而不是通过 Windows 屏幕)关闭。 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();
    }
}

【问题讨论】:

    标签: c++ windows mfc


    【解决方案1】:

    来自CFile documentation 关于modeCreate 标志:

    如果不存在文件,则创建一个新文件。如果文件已经存在,它会被覆盖并初始设置为零长度。

    那么对于modeNoTruncate 标志:

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

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

    【讨论】:

      【解决方案2】:

      问题不在于 modeCreate。正如我所写,文件已正确创建,但在关闭机器时被删除。 看来我发现了问题: 后 我的文件.Flush(); 我添加了 刷新文件缓冲区(我的文件) 这会导致将所有缓冲数据写入文件。 这迫使 Windows 将文件写入磁盘。现在好像可以正常使用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 2013-05-18
        • 1970-01-01
        相关资源
        最近更新 更多