如何检查一个文件是否被另一个应用程序在C ++中打开?

我知道,在C ++中有is_open()函数,但我想要一个程序来检查一个文件是否还没有被另一个应用程序打开。 有没有办法使用标准库来做到这一点?

编辑 – 澄清在答复,这是一个Linux应用程序。

Solutions Collecting From Web of "如何检查一个文件是否被另一个应用程序在C ++中打开?"

不,标准库没有这样的功能。

不仅标准库不具备这种功能,而且一般也不可能。 您可以(在Linux上)检查/proc/*/fd – 但是您的程序可能没有权限在其他用户的进程上执行此操作(例如,这是Ubuntu中的默认设置)。

如果你控制另一个进程(有源代码),最好的计划是在这两个进程中使用咨询锁。 这个锁定在POSIX中定义,并且可以跨操作系统移植。

在Linux中,您可以使用实用程序lsof来查看其他进程打开的文件。

这仅限于您拥有的权限 – 您必须以特权用户的身份执行此检查,否则您只会获得与执行检查的用户打开的文件的结果。

我只知道命令行实用程序,而不是任何可以直接从C代码使用的系统调用。

在Linux中,也可以打开给定文件系统的强制锁定 (mount -o mand),并在文件(chmod gx,g + s)上设置特殊标志。 然后,当您的进程尝试获取写入锁定时,如果另一个进程打开该文件,将会失败。 这是很少使用,但如果你完全控制有问题的系统,它可能是一个选项。

以下代码可能工作。

 int main(int argc, char ** argv) { int fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("open"); return 1; } if (fcntl(fd, F_SETLEASE, F_WRLCK) && EAGAIN == errno) { puts("file has been opened"); } else { fcntl(fd, F_SETLEASE, F_UNLCK); puts("file has not been opened"); } close(fd); return 0; } 

也许你可以试着得到一个完整的写锁定? 如果有其他人开放阅读或写作,这将失败。

 fopen("myfile.txt", "r+") 

如果它不是跨平台的,并且是Win32,那么你可以请求更多的细粒度的锁。

看到这里 ,看看dwShareMode ,值为0,以及其他参数。

不。 除非其他应用程序使用咨询锁。

请参阅http://docs.sun.com/app/docs/doc/816-0213/6m6ne37v5?a=view

非本地,你可以打电话给Sysinternals的handle.exe作为最后的手段…

正如@Neil Butterworth所说,标准库不适用。

在unix中,你可以使用fcntl来使用文件锁。

你可以为你的打开函数编写一个包装器,如果没有其他人打开的话,它将检查一个文件的锁(如果没有的话就会锁)。 你也可以编写一个封装器来封闭文件。

在Windows中,这个小小的肮脏的技巧将工作(如果文件存在,你有正确的权限)

  if ( 0 != rename("c:/foo.txt", "c:/foo.txt") ) { printf("already opened\n"); } 

它也可能在Linux中工作。