我需要创建一个新的文件句柄,以便将对该句柄的任何写操作立即写入磁盘。
额外信息:该句柄将是子进程继承的STDOUT,因此我需要该进程的任何输出立即写入磁盘。
研究
“写操作不会通过任何中间缓存,它们将直接传输到磁盘。”
我编写了一个非常基本的测试程序,嗯,它没有工作。我在CreateFile上使用了标志,然后在一个长循环中使用
接下来我尝试的是每次写入后手动刷新文件,使用
那么,我的问题是,
在“真实世界”的程序中,我无法刷新文件,因为我无法控制正在使用它的子进程。
还有
编辑:我已经制作了一个专门用于观察文件大小如何更改的项目。它使用.NET
以下是输出。查看时间戳中的秒数。
“内置无缓冲版本:”
额外信息:该句柄将是子进程继承的STDOUT,因此我需要该进程的任何输出立即写入磁盘。
研究
CreateFile
文档,FILE_FLAG_WRITE_THROUGH
标记看起来正是我需要的:“写操作不会通过任何中间缓存,它们将直接传输到磁盘。”
我编写了一个非常基本的测试程序,嗯,它没有工作。我在CreateFile上使用了标志,然后在一个长循环中使用
WriteFile(myHandle,...)
,在大约15秒钟内写入约100MB的数据(我添加了一些然后,我设置了一个专业的监视环境,包括在资源管理器中不断地按下F5。结果:文件保持在0kB,然后在测试程序结束时跳至100MB左右。接下来我尝试的是每次写入后手动刷新文件,使用
FlushFileBuffers(myHandle)
。这使观察到的文件大小按预期稳步增长。那么,我的问题是,
FILE_FLAG_WRITE_THROUGH
不应该在不手动刷新文件的情况下完成这个操作吗?我错过了什么吗?在“真实世界”的程序中,我无法刷新文件,因为我无法控制正在使用它的子进程。
还有
FILE_FLAG_NO_BUFFERING
标志,由于同样的原因无法使用-无法控制使用句柄的过程,因此无法像该标志所需的那样手动对齐写入。编辑:我已经制作了一个专门用于观察文件大小如何更改的项目。它使用.NET
FileSystemWatcher
类。我也写了较少的数据-总计约100kB。以下是输出。查看时间戳中的秒数。
“内置无缓冲版本:”
25.11.2008 7:03:22 PM: 10230 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10200 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10190 bytes added.
...以及“强制手动刷新”版本(每~2.5秒调用一次FlushFileBuffers()
):
25.11.2008 7:06:10 PM: 10230 bytes added.
25.11.2008 7:06:12 PM: 10230 bytes added.
25.11.2008 7:06:15 PM: 10230 bytes added.
25.11.2008 7:06:17 PM: 10230 bytes added.
25.11.2008 7:06:19 PM: 10230 bytes added.
25.11.2008 7:06:21 PM: 10230 bytes added.
25.11.2008 7:06:23 PM: 10230 bytes added.
25.11.2008 7:06:25 PM: 10230 bytes added.
25.11.2008 7:06:27 PM: 10230 bytes added.
25.11.2008 7:06:29 PM: 10230 bytes added.