【问题标题】:Open and lock file for read and write打开并锁定文件以进行读写
【发布时间】: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+" 不满足你的需求吗?

标签: c windows io


【解决方案1】:

根据这篇文章 - How do I lock files using fopen()? - flock 可以帮到你

【讨论】:

  • fopen()在Windows上默认锁定文件,不需要调用flock(),它甚至在Windows的stdlib中都不存在。
  • 根据link freopen_s 关闭并重新打开文件并释放并重新获取锁。如果您知道要写入,为什么不直接打开具有写入权限的文件?
  • 因为,正如我在第三个示例中提到的,我无法读取文件内容并在单个 fopen() 中完全重写它。
  • @Klepak 带有“rb+”标志,您可以读取和写入文件。像你一样使用“ab+”,你只是附加了一些东西。因此,您可以使用此标志尝试您的第三个示例。另一种可能是用“rb+”打开它,读取所有内容,截断文件link并在上面写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多