【问题标题】:Why does WriteFile not run more than once?为什么 WriteFile 不运行多次?
【发布时间】:2015-02-21 10:40:30
【问题描述】:

这是我陷入无限循环的代码(据我所知)

while(true) {
    DWORD TitleID = XamGetCurrentTitleId();
    std::ostringstream titleMessageSS;
    titleMessageSS << "Here's the current title we're on : " << TitleID << "\n\n";
    std::string titleMessage = titleMessageSS.str(); // get the string from the stream
    DWORD dwBytesToWrite = (DWORD)titleMessage.size();
    DWORD dwBytesWritten = 0;
    BOOL bErrorFlag = FALSE;
    HANDLE logFile = CreateFile( "Hdd:\\LOGFile.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    bErrorFlag = WriteFile(logFile, titleMessage.c_str(), dwBytesToWrite, &dwBytesWritten, NULL);
    CloseHandle(logFile);
    Sleep(30000);
}
return NULL;

有没有人知道为什么这只写一次?我等了 5 多分钟,看看它到底有没有用。

【问题讨论】:

  • 这都不是标准的c++,我强烈推荐你使用Standard I/O library中的类和函数。还要注意你的while(true) 循环永远不会结束,这可能不是你想做的。
  • MSDN:CREATE_NEW:创建一个新文件,前提是它不存在。
  • @πάνταῥεῖ:如果您从不查看原生 API,如何了解操作系统?
  • @πάνταῥεῖ:与本机 Windows I/O 系统相比,标准 I/O 库感觉非常糟糕。重叠 I/O、文件映射或 关闭时删除 创建处置只是 C++ 标准 I/O 库中根本没有反映的几个方面。
  • 如果您 1. 不检查错误和 2. 不执行基本调试,那么试图解决这个问题是没有希望的。

标签: c++ winapi writefile


【解决方案1】:

CreateFile 中的标志CREATE_NEW 阻止更新文件,因为CreateFile 失败并显示ERROR_FILE_EXISTS。请改用OPEN_ALWAYS。 而且它总是会被截断。 替换 GENERIC_WRITE 替换为 FILE_APPEND_DATA 如果您想在日志文件末尾添加新行。

整个CreateFile 行应该是:

HANDLE logFile = CreateFile( "Hdd:\\LOGFile.txt", FILE_APPEND_DATA , 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

仔细阅读CreateFile 文档,这是值得的,因为它在 windows IO 世界中具有核心作用: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

看还加: https://stackoverflow.com/a/9891875/1922748

【讨论】:

    【解决方案2】:

    正如 Martin James 提到的,来自 MSDN: CREATE_NEW

    创建一个新文件,前提是它不存在。

    如果指定文件存在,则函数失败,最后一个错误 代码设置为 ERROR_FILE_EXISTS (80)。

    如果指定的文件不存在并且是可写文件的有效路径 位置,创建一个新文件。

    所以看起来第一次调用后句柄无效,因此WriteFile()失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多