winapi - 如何写入使用 FILE_FLAG_NO_BUFFERING 打开的文件的结尾?

标签 winapi vb6 file-io buffer

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

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

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

最佳答案

我相信 SetEndOfFile 是唯一的方法。

我同意 Mike G. 的观点,即无论是否使用 FILE_FLAG_NO_BUFFERING,都应该对代码进行测试。现代操作系统上的 Windows 文件缓冲非常有效。

关于winapi - 如何写入使用 FILE_FLAG_NO_BUFFERING 打开的文件的结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/147996/

相关文章:

c++ - 如何在 Win32 中递归创建文件夹?

c - 如何在我的计算机中用 C 查找已安装驱动程序的名称?

windows - 如何在 Windows 8 桌面中扫描低功耗蓝牙设备?

string - 这条线有什么问题吗?

java - 小 LibGdx 加载文件时遇到问题

c - 使用 putenv 和 getpid 在 C 中使用 CreateProcess 时出现错误

class - 您如何处理 VB6 中缺少构造函数的问题?

vb6 - 这个 CASE 语法是什么意思? - VB6

.net - 是否有一种经过验证的方法可以在 .NET 中非常快速地访问非常大(> 1 GB)二进制文件的特定区域

c++ - 在 C++ 中存储变量