【问题标题】:How to get a Win32 program to update the file size while still writing files如何让 Win32 程序在写入文件的同时更新文件大小
【发布时间】:2016-05-26 14:30:02
【问题描述】:

我有一个 Win32 程序,它使文件保持打开状态并在几个小时内向其中写入数据。我希望文件大小(如资源管理器窗口中所示)每隔一段时间更新一次。

例如,当浏览器下载一个大文件时,您可以看到文件大小随时间变化,即使文件仍在下载。

在我当前的幼稚实现中,文件大小保持为零,直到我关闭文件。

如何在 Win32 中执行此操作?目前该文件使用std::ofstream 打开。这是 std::ostream::flush() 的正确应用吗?还是我需要定期关闭并重新打开文件?

【问题讨论】:

标签: windows file winapi stdio


【解决方案1】:

std::ostream::flush() 确保您将数据安全地保存在磁盘上。在自动刷新对您来说不够好的情况下,刷新缓冲区是一个有效的用例(例如,在太长的时间内写入的数据太少,数据不断写入但也需要不断访问,您需要确保在崩溃或断电等情况下记录数据);然而,在某些操作系统/文件系统组合上(参见Why is the file size reported incorrectly for files that are still being written to?),仍然不会相应地更新文件大小。在 Win32 上,您通常不会在实际关闭/重新打开句柄之前看到大小更新;有时重新阅读目录等会有所帮助,有时根本不会。

因此,您可以使用例如ReOpenFile 强制更新,或者简单地使用关闭/打开而不是刷新。确切的解决方案取决于您是否非常需要更新的文件大小并且降低的输出速率不是一个真正的问题(在这种情况下重新打开是最好的选择),或者您是否可以忍受报告的错误大小(在这种情况下,冲洗是 IMO 的最佳选择)。

【讨论】:

  • 谢谢,原来我只需要按 F5 即可刷新资源管理器窗口。我尝试了 flush() 和重新打开的技巧,虽然这些并没有造成任何伤害,但它仍然需要我手动刷新 Explorer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多