对于the code snippet下面,当 std::fstream 被销毁时,是否保证文件立即写入磁盘?
#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[]){
{
std::fstream file{"test.txt"};
file << "when the file is actually written out?" << std::endl;
}
return 0;
}
最佳答案
将我的评论改写为实际答案:
没有。该代码片段不保证数据位于“持久存储”上。您告诉操作系统获取该文件并存储它。但操作系统获取该数据并将其提供给 IO 调度程序。调度程序执行或不执行的操作(部分)超出您的控制范围,因为它会按其认为合适的方式安排任务。
但是,您可以通过调用sync()强制调度程序将所有挂起的元数据和数据写入“持久存储”(读取:实际文件系统)
https://man7.org/linux/man-pages/man2/sync.2.html
警告,假设:可能存在的问题是您正在统治调度程序。因此,如果该机器上的另一个程序有一个巨大的文件要写入,并且调度程序希望等待该文件写入,因为现在 io 通常很高。如果您调用sync(),您会强制调度程序写入所有(元)数据,因此它也会写入该文件。直到所有数据写入后,同步才会返回。您的写入在队列中的位置并不重要,因此实际上可能需要几秒钟(即使在慢速 io 和 Hughe 文件上也需要几分钟)才能返回该调用。
不知道如何在 Windows 上执行此操作,或者 Windows 实际上如何处理磁盘写入
关于c++ - 文件何时真正写入磁盘?是否保证在 std::ofstream 被破坏后立即将文件写入磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73483179/