有没有一种可移植的(std::filesystem)方法来测试文件是否被“锁定”或拥有“只读”权限?例如,POSIX有一个不同于标准MacOS“权限”的“锁定”设置。
在尝试执行删除操作之前,我需要测试是否可以删除文件。理想情况下,我希望避免打开R/W文件作为测试。
这是在保存/重命名过程中进行的,并且(至少在过去的MacOS文件系统中),即使文件在查找器中被“锁定”,操作系统也会调用“交换”两个文件。由于围绕如何保存文件的复杂性,以及以前版本是如何“保留”的,所以最好提前知道,这样就可以避免操作。
进一步注意:在具有读写权限的锁定文件上以R/W (std::ios::out | std::ios::in)打开流将失败,错误号=1(不允许操作)。如果文件是只读的,但没有锁定,它将失败并返回errno 13 (权限被拒绝)。
这里讨论了一种特定于MacOS (Cocoa)的方法来测试锁位:
发布于 2019-05-29 02:56:00
好的--这可能不是确切的答案,但看起来您可以做到这一点(正如建议的here:
#include <sys/stat.h>
bool IsLocked(std::string& thePath)
{
bool isLocked = false;
struct stat buf;
int retval = stat(thePath.c_str(), &buf); // NOTE: retval could be an error, like ENOENT (file doesn't exist)
if (0 != (buf.st_flags & UF_IMMUTABLE)) {
isLocked = true;
//is immutable
}
return isLocked;
}
在我自己的代码中,我以一种更健壮的方式处理retval错误。你也应该这样做!
但请注意:虽然这确实正确地指示了文件的Finder的锁位/标志的状态,但它并不反映文件是否为“只读”。UF_IMMUTABLE上的文档说“文件不能被更改”--这显然是不准确的。
https://stackoverflow.com/questions/56347581
复制相似问题