我知道在C++中有is_open()
函数,但我想要一个程序来检查文件是否已被另一个应用程序打开。是否有使用标准库的方法可以实现?
编辑 - 在答案中澄清这是针对Linux应用程序。
标准库不仅没有这个功能,通常情况下也无法实现。在Linux上,您可以检查/proc/*/fd
- 但有可能您的程序没有权限查看其他用户的进程(例如,在Ubuntu中默认是如此)。
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;
}
ls -al /proc/21862/fd/47 l-wx------ 1 user user 64 1월 29 17:12 /proc/21862/fd/47 -> /home/user/data/201802201020.mp4
。(Ubuntu) - uthlinefopen("myfile.txt", "r+")
如果它不是跨平台的而是Win32,那么您可以请求更细粒度的锁定集合。
请参见此处并查看dwShareMode
,值为0以及其他参数。
如果没有本地方法,你可以作为最后的手段调用Sysinternals' handle.exe...
正如@Neil Butterworth所说,标准库并没有提供此功能。
在Unix中,您可以使用fcntl来使用文件锁。
您可以编写一个包装器函数来检查文件是否被其他人打开,并在没有锁定的情况下对其进行锁定。您还应该为关闭编写一个包装器函数,在文件关闭时释放该锁定。
在Windows中,这个小而“不太光彩”的技巧会起作用(前提是文件存在且你拥有正确的权限)
if ( 0 != rename("c:/foo.txt", "c:/foo.txt") ) {
printf("already opened\n");
}
这个程序很可能也能在Linux上运行。