【发布时间】:2017-02-08 13:00:09
【问题描述】:
我编写了一个程序,将两个小文件压缩成一个更大的文件。我首先从输入文件中读取数据,合并数据,然后将输出写入临时文件。完成后,我将临时文件重命名为所需的文件名(位于磁盘上的同一分区中)。这是伪代码:
FILE* fp_1 = fopen("file_1.dat", "r+b");
FILE* fp_2 = fopen("file_2.dat", "r+b");
FILE* fp_out = fopen("file_tmp.dat", "w+b");
// 1. Read data for the key in two files
const char* data_1 = ...;
const char* data_2 = ...;
// 2. Merge data, store in an allocated buffer
// 3. Write merged buffer to temp file
fwrite(temp_buff, estimated_size, 1, fp_out);
fflush(fp_out);
fclose(fp_1);
fclose(fp_2);
fclose(fp_out);
// Now rename temp file to desired file name
if(std::rename("file_tmp.dat", "file_out.dat") == 0)
{
std::remove("file_1.dat");
std::remove("file_2.dat");
}
我用两个 5 MB 的输入文件反复测试了该程序。有一次我突然拔掉电源线关闭了系统。重新启动系统后我检查了数据,发现输入文件被删除,file_out.dat 被全零填充。这让我相信系统在删除 2 个输入文件后立即停机,并且输出数据仍在磁盘控制器缓冲区的某个位置。如果这是真的,那么我有什么方法可以检查数据是否已实际写入磁盘?
【问题讨论】:
-
看到操作系统甚至不确定(磁盘可能有自己的 RAM 缓存),这是一个棘手的问题。
标签: c++ file-handling stdio