如何编写使用FILE_FLAG_NO_BUFFERING打开的文件的结尾?

时间:2008-09-29 08:51:42

标签: winapi vb6 file-io buffer

我使用VB6和Win32 API将数据写入文件,此功能用于导出数据,因此写入磁盘性能是我考虑的关键因素。因此,在通过调用FILE_FLAG_NO_BUFFERING打开文件时,我使用FILE_FLAG_WRITE_THROUGHCreateFile选项。

FILE_FLAG_NO_BUFFERING要求我使用自己的缓冲区并以磁盘扇区大小的倍数将数据写入文件,除了最后一部分数据之外,这通常没有问题,如果不是精确的话扇区大小的多个将包括字符零填充文件,如何在写入最后一个块时将文件大小设置为不包括这些字符零?

我可以使用SetEndOfFile但是这需要我关闭文件并重新打开它而不使用FILE_FLAG_NO_BUFFERING。我见过有人谈论NtSetInformationFile然而我找不到如何在VB6中使用和声明它。 SetFileInformationByHandle可以完全按照我的要求行事,但只有在Windows Vista中才能使用,我的应用程序需要与以前版本的Windows兼容。

4 个答案:

答案 0 :(得分:2)

我不确定,但您确定设置FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH可以获得最佳性能吗?

它们肯定会导致您的数据尽快进入磁盘,但这种情况实际上并没有帮助提高性能 - 它只是帮助您希望尽可能完整的日志文件之类的可靠性。发生事故。

对于您所描述的数据导出例程,允许操作系统缓冲数据可能会导致更好的性能,因为写入将按照其他磁盘活动进行调度,而不是强制磁盘跳回到您的每次写文件。

为什么不在没有这些选项的情况下对代码进行基准测试?保留0字节填充逻辑,使其成为公平的测试。

如果事实证明跳过这些选项的速度更快,那么您可以删除0填充逻辑,并且您的文件大小问题会自行解决。

答案 1 :(得分:2)

我相信SetEndOfFile是唯一的方法。

我同意Mike G.你应该在有和没有FILE_FLAG_NO_BUFFERING的情况下对你的代码进行测试。现代操作系统上的Windows文件缓冲非常有效。

答案 2 :(得分:1)

我很惊讶!使用Windows缓冲而不是自己完成所有操作 MUCH 更快。我一直在写一个1Gb文件进行测试,使用我自己的缓冲区,FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH选项平均花费21.146秒,没有那些设置并使用Windows缓冲区平均时间降至13.53秒,这快了30%!

自我注意:无需重新发明轮子。 ; - )

谢谢你 Mike G '的快速准确答案。还要感谢你' gabr ',现在根本不需要打扰SetEndOfFile

答案 3 :(得分:1)

对于1 GB的文件,Windows缓存确实可能更快,尤其是。如果做很多小IO。如果您处理的文件比可用RAM大得多,并且执行大块IO,那么您设置的标志将产生必须更好的吞吐量(对于大量线程和/或随机大块IO,速度提高3倍)。