【问题标题】:How to check if a file is used by another process in C++?如何检查文件是否被 C++ 中的另一个进程使用?
【发布时间】:2020-07-16 12:30:31
【问题描述】:

我需要检查一个文件当前是否被另一个进程打开,例如文本编辑器(但也需要适用于其他所有内容)。

我尝试使用std::ofstream::is_open() 等,但这不起作用。当我的程序检查它是否打开时,我可以在我的文本编辑器中打开该文件。该程序将其视为一个关闭的文件并继续。只有当我以另一个 ofstream 的身份打开它时,它才会起作用。

我正在使用文件系统库来复制文件,并且只有在客户端服务器上的另一个进程当前没有写入该文件时,它们才可能被复制(然后删除)。

真的很好奇这个。很长一段时间以来一直在想这个问题,但我自己从来没有找到一个好的方法。

我目前正在制作一个需要能够在 linux 和 windows 上运行的程序。每 5 秒它会将目录 a、b、c、d 中的所有文件复制到 x。这可以由客户端在规则中设置。在它复制了所有内容之后。所有文件都可能被删除。一天后(或客户告诉程序的任何内容),来自 x 的所有文件都需要压缩并存档在位置 y 上。因此问题是,如果将所有文件放在目录 a、b、c、d 中的其他程序现在没有触及该特定文件,则文件可能只会被删除(和复制)。希望这能让问题更清楚。

在任何人开始之前。是的,我知道数据竞争条件。我暂时不关心这个。该程序对文件的内容完全不做任何事情。并且文件被其他进程关闭后,将永远关闭。

【问题讨论】:

  • 您要解决的真正问题是什么?不,不是关于检查另一个进程是否打开文件的问题。您认为解决方案是检查另一个进程是否打开了文件。
  • 不要评论你自己的问题。 edit
  • 我相信在 MS-Windows 上,打开文件的进程要么最终自动锁定文件,要么明确地这样做,并防止它被删除。在 Linux 上,删除文件根本不会影响正在读取它的任何其他进程。它将继续正常读取它,即使在它被删除之后,就任何其他进程而言也是如此。所以,看起来你认为存在的问题,实际上并不存在,而且实际上不需要为此做任何事情。

标签: c++ file filesystems fstream data-race


【解决方案1】:

我需要检查一个文件当前是否被另一个进程打开

这是特定于操作系统的(可能没用)

所以先读一个好的textbook on operating systems

在 Linux 上,特别是您可以使用 inotify(7) 设施,或 /proc/ 伪文件系统(请参阅 proc(5)),或者可能使用 lsof(8)。它们仅适用于本地文件系统(不适用于远程文件系统,例如 NFS)。另见Advanced Linux Programmingsyscalls(2)

您可能会遇到意外(例如,一个进程被安排得如此之快,以至于删除了一个您没有时间做任何事情的文件)

Windows 版请花更多时间阅读its documentation

我目前正在制作一个需要能够在 linux 和 windows 上运行的程序。每 5 秒它会将目录 a、b、c、d 中的所有文件复制到 x。

您可能会在 rsync 的源代码中寻找灵感。

我不明白你的实际问题是什么,但rsync 可能是解决方案的一部分,据传它可以在 Windows 和 Linux 上运行

【讨论】:

  • 它需要在windows服务器上运行,并且客户端发表评论说“越来越多的客户正在切换到linux”,因此它需要能够在两者上运行。目前,我知道一个大约 5 分钟前的文件不再被触及。所以现在我会利用时间。但是,如果文件当前正在使用中,那么一种独立检查操作系统的方法将是一个很棒的功能。
  • 感谢您的回答。我尝试过投票,但我还没有被允许。一直潜伏在这个论坛上:)
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 2014-07-12
  • 2012-03-09
  • 2013-01-09
  • 1970-01-01
  • 2014-11-22
  • 2010-11-06
  • 2020-11-27
相关资源
最近更新 更多