首页 > 解决方案 > 以编程方式防止文件被重命名或删除,但仍使其可写

问题描述

我有一个我无法控制的应用程序(比如说App A),我无法修改、写入文件并能够重命名和删除它。

我有另一个应用程序(比如说App B),它正在从 App A 编写的文件中读取数据。我可以完全控制 App B 中的代码。

我应该怎么做(即为文件设置什么权限,或者当它打开文件时我应该在应用程序 B 中使用什么锁),以便应用程序 A 可以继续写入文件但不能重命名或删除它。

我尝试fcntl()在 App B 中使用来设置文件的读写锁,但 App A 仍然可以重命名文件。

这是从 App B 获取锁定的示例代码(fd是文件的文件描述符):

int fd = open(filePath, O_RDONLY);
struct flock lock_it;
lock_it.l_type = F_WRLCK; // I've tried F_RDLCK as well.
lock_it.l_whence = SEEK_SET;
lock_it.l_start = 0;
lock_it.l_len = 0; // I want to lock the entire file. 
int lockingResult = fcntl(fd,F_SETLK,&lock_it);
cout << "Got a fcntl lock: " << lockingResult << " on  FD: " << fd << endl;

但是上面的代码并没有阻止 App A 重命名文件。

有什么想法我应该怎么做?我的代码是 C++,我的应用程序在 RedHat Linux 上运行。

标签: c++linuxfile-handlingfcntl

解决方案


要写入文件,您必须对文件具有写权限,要删除或重命名文件,您必须对目录具有写权限。

注意:即使您不能删除文件,您仍然可以截断它,除非您的文件系统支持仅附加文件的概念。


推荐阅读