gpt4 book ai didi

c++ - 如何在不打开文件的情况下测试文件是否被锁定和/或只读?

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:59 25 4
gpt4 key购买 nike

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

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

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

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

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

How to check whether a file is locked in Cocoa?

最佳答案

好的——这可能不是准确的答案,但你似乎可以做到这一点(建议 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 锁定位/标志的状态,但它不会反射(reflect)文件是否为“只读”。 UF_IMMUTABLE 上的文档说“文件可能不会更改”——这显然是不准确的。

关于c++ - 如何在不打开文件的情况下测试文件是否被锁定和/或只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56347581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com