Windows系统中是否有未缓冲的I / O?

我想找到低级C / C ++ API,相当于linux系统中的“write”,没有缓冲区。 有吗?

缓存的I / O如fread,fwrite不是我想要的。

使用FILE_FLAG_NO_BUFFERING选项查看CreateFile

http://www.codeproject.com/Articles/51678/Improve-responsiveness-in-Windows-with-the-FILE_FL

防止交换缓存的唯一方法是使用FILE_FLAG_NO_BUFFERING标志打开文件。 但是,这要求磁盘I / O请求具有可被扇区大小(512到4096字节)整除的大小,这将需要对依赖于能够请求不同大小的大多数应用程序进行大量重写。

该项目包含一个drop-in包装器,它提供CreateFile_NB()ReadFile_NB()WriteFile_NB()CloseHandle_NB()函数,这些函数在关闭为写入而打开的文件时负责排队和调整文件大小。

http://msdn.microsoft.com/en-us/library/cc644950(v=vs.85).aspx

使用CreateFile函数打开或创建文件时,可以指定FILE_FLAG_NO_BUFFERING标志以禁用从文件读取或写入文件的数据的系统缓存。 虽然这样可以完全和直接地控制数据I / O缓冲,但在文件和类似设备的情况下,必须考虑数据对齐要求。

POSIX write()函数的Win32等价是WriteFile() 。 文档建议使用未缓冲的文件I / O,并推荐此页面以获取更多信息。

流可以达到你所能得到的低水平……而且它们可以是无缓冲的。

 int setvbuf(
   文件*流,
    char *缓冲区,
    int模式,
    size_t大小 
 );

   setvbuf(stdout,(char *)NULL,_IONBF,0);  //无缓冲的标准输出

这是vc2008帮助文档的摘录。

setvbuf函数允许程序控制流的缓冲和缓冲区大小。 stream必须引用一个打开的文件,该文件在打开后未经过I / O操作。 缓冲区指向的数组用作缓冲区,除非它是NULL,在这种情况下,setvbuf使用自动分配的长度为2 * 2字节的缓冲区。

模式必须是_IOFBF_IOLBF_IONBF 。 如果mode是_IOFBF_IOLBF ,则size用作缓冲区的大小。 如果mode是_IONBF,则流是无缓冲的,并且忽略大小和缓冲区。 模式及其含义的值为:

_IOFBF全缓冲; 也就是说,缓冲区用作缓冲区,大小用作缓冲区的大小。 如果buffer为NULL,则使用自动分配的缓冲区大小字节长度。

_IOLBF对于某些系统,这提供了行缓冲。 但是,对于Win32,行为与_IOFBF – 完全缓冲相同。

_IONBF无论缓冲区或大小如何,都不使用缓冲区。

您可以在此处使用_write MSDN Page 。