是否有可移植的(std::filesystem)方法来测试文件是否“锁定”或具有“只读”权限?例如,MacOS Finder 具有“锁定”设置,这与标准 POSIX“权限”不同。
在尝试执行删除操作之前,我需要测试是否可以删除文件。理想情况下,我想避免打开文件进行读/写作为测试。
这是在保存/重命名过程中,并且(至少在过去的 MacOS 文件系统中),即使文件在 Finder 中“锁定”,操作系统调用“交换”两个文件也会起作用。由于文件如何保存以及如何“保留”先前版本的复杂性,最好提前了解,以便避免操作。
进一步注意:在具有读写权限的锁定文件上以 R/W (std::ios::out | std::ios::in) 打开流将失败,并出现 errno = 1(不允许操作)。如果文件是只读但未锁定,则会失败并显示 errno 13(权限被拒绝)。
这里讨论了测试锁定位的 MacOS (Cocoa) 特定方法:
如何在 Cocoa 中检查文件是否被锁定? https://stackoverflow.com/q/11737819/516545
好的——这可能不是准确的答案,但看起来你可以这样做(按照建议here https://stackoverflow.com/a/13119512/516545:
#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 的文档说“文件可能无法更改”——这显然不准确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)