【发布时间】:2019-12-20 20:00:42
【问题描述】:
我想打开文件,阅读它的内容,然后完全覆盖它。 除此之外,我希望这个文件在整个过程中被进程锁定。 这是我的想法:
fopen_s(&fp, file_path, "rb");
...
fclose(fp);
fopen_s(&fp, file_path, "wb+");
...
fclose(fp);
但是当文件未被进程锁定时,此解决方案会生成小的时间窗口。这是第二个想法:
fopen_s(&fp, file_path, "rb");
...
freopen_s(&fp, file_path, "wb+", fp);
...
fclose(fp);
在这里,我找不到freopen_s 是否保留文件锁定的信息,但我想它没有。
我想到的第三个也是最后一个想法是以ab+ 模式打开文件:
fopen_s(&fp, file_path, "ab+");
// read content
fseek(fp, 0L, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
fread(buffer, sizeof(char), file_size, fp);
// TODO: override file
fseek(fp, 0L, SEEK_SET);
fwrite("hello", 1, 5); // does not work - appends to end of file
fclose(fp);
这个解决方案具有最大的潜力,但我不能让它以任何方式覆盖文件内容 - 每个写入文件内容的方法都是追加而不是写入开始。
是否有任何选项可以改进上述解决方案之一,或者有没有其他方法可以实现我的目标? 请注意,我不想使用 WinAPI 调用。
【问题讨论】:
-
"rb+"不满足你的需求吗?