【问题标题】:Porting access(2) Linux system call to boost::filesystem移植访问(2)Linux系统调用到boost::filesystem
【发布时间】:2014-05-22 08:31:09
【问题描述】:

目前,我有一个应用程序正在从 Linux 移植到 Windows。我希望尽可能使用 boost。

我目前有以下要移植的 sn-p,这是不言自明的。

return access(backupFile.c_str(), R_OK) == 0;

问题是 boost::filesystem 似乎没有直接的等价物。也就是说,我可以做到以下几点:

namespace fs = boost::filesystem;

if (!fs::is_regular_file(filename, ec))
    return false;

fs::file_status s = fs::status(filename);

// Which permissions should I be testing for?
if (s.permissions() == ???)

permissions() 枚举可以在here 中找到。但是,当我阅读它时,它不是直接翻译,因为我必须测试我是否在适用的组中以及该组的权限是否也可用。

有没有更简单的方法?我对行为的解释是否正确?

(当然,我总是可以尝试打开文件进行阅读,但这不是本题的目标)。

【问题讨论】:

    标签: c++ linux boost-filesystem


    【解决方案1】:

    由于你是移植到windows,根据微软_access()第二个参数是:

    00 Existence only
    02 Write-only
    04 Read-only
    06 Read and write
    

    所以,我认为您应该使用与上述匹配的提升权限,同时考虑权限参考链接中的以下内容:

    Windows: All permissions except write are currently ignored. There is only a single
    write permission; setting write permission for owner, group, or others sets write
    permission for all, and removing write permission for owner, group, or others removes
    write permission for all.
    

    或者,您可能希望使用 Microsoft 指定的参数继续使用 Windows 版本的 access()(MS 编译器为 _access())。

    您可能想要查看的另一个类是 ATL CAccessToken

    【讨论】:

    • 我已经多年没有使用 CE 了,我不记得这个了,但是如果后期版本没有它,还有 GetFileAttributes() API 你可能要检查:)
    • 完成。解决了我的问题。
    • 在 MSVC C 标准库实现中,即使在今天,_access 及其所有派生词也根本不验证 04 Read-only 访问模式:查看其源代码或仅撤销对文件的读取访问权限并检查 _access 返回的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-03-20
    • 2016-03-17
    相关资源
    最近更新 更多