【问题标题】:Wait for file to exist and be not ocupated by others等待文件存在且不被其他人占用
【发布时间】:2025-12-13 10:40:01
【问题描述】:

问题

如何监控我的文件系统以在创建后读取文件。这将适用于基于 Linux 的系统,但如果解决方案是跨平台的,那就太好了。重要的要求是,不应该有任何其他文件描述符可以写入该配置文件。

我读过inotify,但这不是跨平台的,需要很多知识。我对新的 c++17 文件系统模块很好奇。

我可以通过简单的while(!fileexist(fielanme)) sleep(1); 做到这一点,但我很好奇更多成熟的解决方案

背景

我正在编写可以从 API (REST) 配置的应用程序。但是一旦配置就可以轻松启动(存储配置文件)。

所以我认为这是将这项任务分成两个的好方法:

  1. REST -> 只需使用 conf 创建文件。
  2. 读取配置时,主要等待文件存在并阻止文件被其他以写入模式打开。

【问题讨论】:

    标签: c++ linux file-io filesystems c++17


    【解决方案1】:

    没有跨平台的方法可以做到这一点。最好的方法是将文件写入一个临时名称,然后将其重命名为应用程序正在查找的文件。在大多数操作系统上,rename() 操作是原子操作。然后读取应用程序可以简单地等待文件存在。

    所以你的等待代码的结构可能是(这是伪代码):

    while (true) {
        if (file_exists(filename)) {
            process the file
            remove the file
        }
        sleep(wait_time);
    }
    

    【讨论】:

    • 是的。我听说rename() 是一个很好的解决方案。所以你只投票给简单的while
    • github.com/simongeilfus/Watchdog 是跨平台解决方案的一项正在进行的工作。但总的来说,监视文件系统的变化是在异步和文件 io 的交叉点,标准化很差。