`flush` 和 `sync_all` 有什么区别?

Aur*_*ier 7 rust

我很好奇我是否应该使用Write::flush或者File::sync_all当我写完文件时。

Zet*_*eta 5

TL;DR:如果您想“确保”数据已写入设备,请File::sync_all使用File. 请注意,但这不是必需的。


Write::flush实现File使用依赖于操作系统的flush操作,例如std::sys::unix::File::flush、 或std::sys::windows::File::flush。这些flush操作没有任何作用。两种实现都只返回Ok(()).

为什么?因为在这两种情况下write()都已经使用了底层系统调用write();Windows 上基于句柄的写入,以及类 Unix 系统上基于文件描述符的写入。到那时,除了特定于 files 的系统调用之外,它就超出了 Rust 环境的范围。

那么 Write::flush什么用呢?如果实际文件之前有任何类型的缓冲区(例如BufWriter. 如果您有一个File被 a 包裹的文件BufWriter,那么您需要使用它flush来确保字节被写入文件。虽然记住BufWriterDrop实现也尝试(!)写入这些字节很有用,但它可能会也可能不会工作,所以你应该Write::flush在那里调用(请参阅BufWriter的文档)。

话虽这么说,sync_all这是没有必要的,反而会阻止您的程序。操作系统将处理文件系统同步。sync_data虽然您当然可以通过或等待同步发生sync_all,但通常最好不要执行任何操作。

  • 虽然你的答案在技术上是正确的,但值得注意的是,如果OP不知道`sync_all()`的作用,他们几乎肯定*不想*在写出随机文件后调用它。`sync_all()` 并不能真正确保文件已被写出到底层硬件(操作系统无论如何都会这样做),它只是让你的程序_等待_直到发生这种情况。只有在非常特殊的情况下才需要这样做。 (3认同)