c++ - 以编程方式防止文件被重命名或删除,但仍使其可写
问题描述
我有一个我无法控制的应用程序(比如说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 上运行。
解决方案
要写入文件,您必须对文件具有写权限,但要删除或重命名文件,您必须对目录具有写权限。
注意:即使您不能删除文件,您仍然可以截断它,除非您的文件系统支持仅附加文件的概念。
推荐阅读
- jquery - ajax 调用中不需要的 null 导致未找到错误
- c# - C# 服务器客户端在连接 UWP 时失败 (2)
- python - 升级过时的软件包后 pip 需要密码
- c++ - c++ r值引用应用于函数指针
- linux - 当 IP 地址改变时 TCP 套接字会发生什么?
- excel - 我需要帮助修复这个 VBA 宏
- r - Alternative to (m)get in data.table functions
- firebase - Difference between Firebase service account key files from Firebase and from GCloud?
- node.js - 如何从另一个(本地)目录导入库?
- sql-server - SQL 列出每辆车的最低价格