代码之家  ›  专栏  ›  技术社区  ›  Serge Rogatch

如何刷新Windows中的所有文件缓冲区?

  •  3
  • Serge Rogatch  · 技术社区  · 6 年前

    FlushFileBuffers() 在Windows中刷新缓冲区直到硬盘驱动器 单一的 文件。有 sync() Linux中用于刷新文件缓冲区的API 全部的 文件夹。

    但是,是否也有用于刷新所有文件的winapi,即 同步() 模拟?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Michael Chourdakis    6 年前

    https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-flushfilebuffers

    可以刷新整个硬盘。

    要刷新卷上所有打开的文件,请使用该卷的句柄调用FlushFileBuffers。调用方必须具有管理权限。有关详细信息,请参阅使用特殊权限运行。

    此外,如果出于某种原因必须刷新数据,则同一篇文章还说明了要遵循的正确过程: CreateFile 函数 FILE_FLAG_NO_BUFFERING FILE_FLAG_WRITE_THROUGH 旗帜。

    由于系统中的磁盘缓存交互,在每次写入磁盘驱动器设备后,如果单独执行许多写入操作,则使用FlushFileBuffers功能可能会效率低下。如果应用程序正在对磁盘执行多次写入,并且还需要确保将关键数据写入持久介质,则应用程序应使用未缓冲的I/O,而不是频繁调用FlushFileBuffers。要打开一个用于未缓冲I/O的文件,请使用文件\u标志\u否缓冲和文件\u标志\u写入标志调用createfile函数。这将防止缓存文件内容,并在每次写入时将元数据刷新到磁盘。有关详细信息,请参见CreateFile。

    同时也要检查 file buffering 关于内存和数据对齐。

        2
  •  2
  •   Mirjalal Edwin Dalorzo    6 年前

    根据 File Management Functions 没有任何 sync() 类似于WinAPI中的Linux。