Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WriteFile()函数可以停止工作吗? 我有一个用C++编写的Windows程序。它使用WriteFile()WinAPI函数定期将信息写入文本文件_C_Windows_Winapi_Visual C++ - Fatal编程技术网

WriteFile()函数可以停止工作吗? 我有一个用C++编写的Windows程序。它使用WriteFile()WinAPI函数定期将信息写入文本文件

WriteFile()函数可以停止工作吗? 我有一个用C++编写的Windows程序。它使用WriteFile()WinAPI函数定期将信息写入文本文件,c,windows,winapi,visual-c++,C,Windows,Winapi,Visual C++,程序在启动时打开文件,并使文件保持打开状态,直到退出。程序使用以下代码打开文件: CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 最近出现了以下问题:在运行大约10天后,程序停止向文件写入信息。但当程序重新启动时,它恢复了对文件的写入 假设程序没有bug,并且WriteFile继续被调用以写入数据:WriteFile函数能否在正常工

程序在启动时打开文件,并使文件保持打开状态,直到退出。程序使用以下代码打开文件:

CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ, &sa,
    OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
最近出现了以下问题:在运行大约10天后,程序停止向文件写入信息。但当程序重新启动时,它恢复了对文件的写入

假设程序没有bug,并且WriteFile继续被调用以写入数据:
WriteFile
函数能否在正常工作一段时间后开始失败?这是什么原因造成的? (除了磁盘空间问题。文件很小,磁盘有足够的空间)


(不幸的是,程序没有检查
WriteFile
的返回值)。

很难想象
WriteFile()
API函数有错误。下一步必须是检查错误代码,并在函数失败时调用
GetLastError()

写文件()API函数有bug是非常不可信的。下一步必须检查错误代码,并在函数失败时调用
GetLastError()

可能导致此问题的一个原因是:

  • 当Windows出于节能目的停止硬盘时,文件将关闭或关闭
  • 当它进入待机模式时也是如此

    • 可能导致这种情况的一个原因是:

      • 当Windows出于节能目的停止硬盘时,文件将关闭或关闭
      • 当它进入待机模式时也是如此

      在我们的例子中,WriteFile函数失败,因为我们在计时器中调用了该函数。线程中还有另一个函数,它在并行线程中调用ReadFile(并访问同一个文件)。由于WriteFile在该实例中没有访问该文件的权限,因此它过去常常失败

      在我们的例子中,WriteFile函数失败了,因为我们在计时器中调用了该函数。线程中还有另一个函数,它在并行线程中调用ReadFile(并访问同一个文件)。由于WriteFile在该实例中没有访问该文件的权限,因此它过去常常失败

      我不知道为什么它失败了,但是你不应该让文件打开那么久。假设它是一个日志文件,通常的做法是在达到时间和/或卷阈值(通常,卷阈值是“一个日志条目”)后关闭并重新打开它。您还应该回收日志,例如,在午夜,关闭当前输出文件并用日期戳重命名,然后在下一个条目准备好写入时启动新日志。任何情况都可能导致写入失败,如果出现失败,则后续写入很可能会失败。一些可能性:内存不足、挂起的写入太多、间歇性硬件故障。如果您没有检查
      WriteFile
      的返回值,那么您所能做的就是推测。(无关):您可以使用
      FILE\u APPEND\u DATA
      而不是
      GENERIC\u WRITE
      检查WriteFile()的MSDN条目。函数失败的原因很多。如果您没有访问应用程序的源代码来向函数添加错误检查,请考虑使用来自SysStudies的Fielon工具来监视文件写入。我不知道这个工具在很长一段时间内的性能有多好,但也许你会发现它很有用。@Marcelo Cantos,长时间打开文件有什么不对?它会导致写文件失败吗?我将其保持打开状态,以确保没有其他应用程序将其打开,并禁止我的应用程序对其进行写访问。我不知道它失败的原因,但同样,你不应该让文件保持打开状态那么长时间。假设它是一个日志文件,通常的做法是在达到时间和/或卷阈值(通常,卷阈值是“一个日志条目”)后关闭并重新打开它。您还应该回收日志,例如,在午夜,关闭当前输出文件并用日期戳重命名,然后在下一个条目准备好写入时启动新日志。任何情况都可能导致写入失败,如果出现失败,则后续写入很可能会失败。一些可能性:内存不足、挂起的写入太多、间歇性硬件故障。如果您没有检查
      WriteFile
      的返回值,那么您所能做的就是推测。(无关):您可以使用
      FILE\u APPEND\u DATA
      而不是
      GENERIC\u WRITE
      检查WriteFile()的MSDN条目。函数失败的原因很多。如果您没有访问应用程序的源代码来向函数添加错误检查,请考虑使用来自SysStudies的Fielon工具来监视文件写入。我不知道这个工具在很长一段时间内的性能有多好,但也许你会发现它很有用。@Marcelo Cantos,长时间打开文件有什么不对?它会导致写文件失败吗?我将其保持打开状态,以确保没有其他应用程序将其打开,并禁止我的应用程序对其进行写访问。您只需将其添加为注释。您只需将其添加为注释。