如何让 Win32 程序在写入文件的同时更新文件大小
How to get a Win32 program to update the file size while still writing files
我有一个 Win32 程序,可以在几个小时内保持文件打开并向其中写入数据。我希望文件大小(如资源管理器 window 中所示)每隔一段时间更新一次。
例如,当浏览器正在下载一个大文件时,您可以看到文件大小随时间变化,即使文件仍在下载。
在我当前的天真实现中,文件大小保持为零,直到我关闭文件。
如何在 Win32 中执行此操作?当前使用 std::ofstream
打开文件。这是 std::ostream::flush()
的正确应用吗?或者我是否需要定期关闭并重新打开文件?
std::ostream::flush()
确保您的数据安全地存储在磁盘上。在自动刷新对您来说不够好的情况下,刷新缓冲区是一个有效的用例(例如,在太长的时间内写入的数据太少,数据不断写入但也需要不断访问,您需要确保在发生崩溃或断电等情况下记录数据);然而,在某些 OS/filesystem 组合中(参见 Why is the file size reported incorrectly for files that are still being written to?),仍然不会相应地更新文件大小。在 Win32 上,您通常不会在实际 closing/reopening 句柄之前看到大小更新;有时重新阅读目录等会有帮助,有时根本不会。
因此,您可以使用例如ReOpenFile 强制更新,或者简单地使用 close/open 而不是刷新。确切的解决方案取决于您是否 非常需要 更新的文件大小并且降低输出率不是真正的问题(在这种情况下重新打开是最好的选择),或者您是否可以忍受报告了错误的尺寸(在这种情况下,冲洗是你最好的选择 IMO)。
我有一个 Win32 程序,可以在几个小时内保持文件打开并向其中写入数据。我希望文件大小(如资源管理器 window 中所示)每隔一段时间更新一次。
例如,当浏览器正在下载一个大文件时,您可以看到文件大小随时间变化,即使文件仍在下载。
在我当前的天真实现中,文件大小保持为零,直到我关闭文件。
如何在 Win32 中执行此操作?当前使用 std::ofstream
打开文件。这是 std::ostream::flush()
的正确应用吗?或者我是否需要定期关闭并重新打开文件?
std::ostream::flush()
确保您的数据安全地存储在磁盘上。在自动刷新对您来说不够好的情况下,刷新缓冲区是一个有效的用例(例如,在太长的时间内写入的数据太少,数据不断写入但也需要不断访问,您需要确保在发生崩溃或断电等情况下记录数据);然而,在某些 OS/filesystem 组合中(参见 Why is the file size reported incorrectly for files that are still being written to?),仍然不会相应地更新文件大小。在 Win32 上,您通常不会在实际 closing/reopening 句柄之前看到大小更新;有时重新阅读目录等会有帮助,有时根本不会。
因此,您可以使用例如ReOpenFile 强制更新,或者简单地使用 close/open 而不是刷新。确切的解决方案取决于您是否 非常需要 更新的文件大小并且降低输出率不是真正的问题(在这种情况下重新打开是最好的选择),或者您是否可以忍受报告了错误的尺寸(在这种情况下,冲洗是你最好的选择 IMO)。