1

是否有一种可移植的(std::filesystem)方法来测试文件是否“锁定”或具有“只读”权限?例如,MacOS Finder 有一个“锁定”设置,它与标准 POSIX 的“权限”不同。

在尝试执行删除操作之前,我需要测试是否可以删除文件。理想情况下,我想避免为 R/W 打开文件作为测试。

这是在 SAVE/RENAME 过程中,并且(至少在过去的 MacOS 文件系统中),即使文件在 Finder 中被“锁定”,操作系统对“交换”两个文件的调用仍然有效。由于围绕如何保存文件以及如何“保留”以前的版本的复杂性,最好提前知道这样可以避免操作。

进一步说明:在具有读写权限的 LOCKED 文件上以 R/W (std::ios::out | std::ios::in) 的形式打开流将失败,并且 errno = 1(不允许操作)。如果文件是只读但未锁定,它将失败并显示 errno 13(权限被拒绝)。

此处讨论了测试锁定位的 MacOS (Cocoa) 特定方法:

如何检查文件是否在 Cocoa 中被锁定?

4

1 回答 1

0

好的——这可能不是准确的答案,但看起来你可以做到这一点(如此处所建议

#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 上的文档说“文件可能不会被更改”——这显然是不准确的。

于 2019-05-28T18:56:00.313 回答