To ::close() or to ::fclose()?

To ::close() or to ::fclose()?

本文关键字:fclose to or To close      更新时间:2023-10-16

当我们调用boost::filesystem::copy()将文件从普通本地分区复制到 Lustre 上托管的分区时,我们有时会看到一个奇怪的问题。通常,如果我们对文件进行cp,我们会注意到目标文件正确存在并且在cp返回后立即可用,但是通过 boost 操作,当它返回时,文件可能全部存在或不存在(在目标)。

浏览加速代码,我看到:

    if ( ::close( infile) < 0 ) sz_read = -1;
    if ( ::close( outfile) < 0 ) sz_read = -1;

我想知道这是否正确,这会将文件正确刷新到目标,还是应该调用::fclose()显式刷新然后关闭文件?我在关闭之前没有看到任何明确的::fflush()调用,所以不确定文件是否真的被正确刷新到目标......

这取决于文件的打开方式。 如果打开时操作系统特定的::open,然后必须用操作系统关闭它具体::close . 如果它是用fopen打开的,那么它必须用fclose关闭。 如果它是用 std::fstream::open(或fstream的构造函数),则必须通过在对象上调用 close 来关闭它。

Boost显然正在使用低级系统调用。 在此在这种情况下,没有需要冲洗的缓冲区。 对于fclosefstream::close,关闭将自动刷新缓冲区。不需要显式刷新。