写入文件会产生一个空文件或根本没有文件
writing to file produces an empty file or no file at all
我的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将文件写入磁盘。现在看来效果不错。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 挂起和取消挂起一个文件DLL
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何打开并写入一个名称取自C++中字符串的文件
- 构建一个由C和C++文件组成的库
- c++多进程编写一个唯一的文件
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何将class.cpp和class.hpp编译为一个.o文件
- 写入文件会产生一个空文件或根本没有文件
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- Pantheios 不使用 MFC 应用程序写入一个文件(一个 exe + 两个 DLL)
- 在C++中一次读取一个文件一个int
- 输入/输出文件(一个字母的大写)
- 如何使用两个预编译的头文件.一个用于托管代码,另一个用于非托管代码.xxx.PCH不是一个有效的预编译头文件