【问题标题】:How to check if a file is write protected in QT?QT如何判断一个文件是否写保护?
【发布时间】:2022-11-22 12:53:31
【问题描述】:

我需要检查文件是否可写,以便在用户尝试打开不可写的文件时显示警告消息。

我在 QT 论坛上找到了以下示例来检查文件是否可写:

const QFileInfo info(fileName);
if (info.permission(QFile::WriteOwner | QFile::WriteGroup | QFile::WriteUser)) {
  qDebug() << "File is writable";
} else {
 qDebug() << "Read Only file";
}

// Or even simpler:
if (info.isWritable()) {
  qDebug() << "File is writable";
} else {
 qDebug() << "Read Only file";
}

但不幸的是,上面的示例仅在文件具有只读属性时才有效,就像这样(这个文件是简单的 txt,我将其标记为只读):

我在QT论坛上发现应该先看文件权限。因此,如您所见,我的文件不是只读文件(这是我正在处理的真实文件的权限)。

如果我转到文件属性的安全部分,我会发现该文件只有读取和执行权限,当然没有写入权限。

我尝试通过以下代码获取文件权限,但似乎不起作用。

QFileDevice::Permissions p = QFile(fileName).permissions();

if (p & QFileDevice::ReadOwner)
{
    qDebug() << "Read file";
}
if (p & QFileDevice::WriteOwner)
{
    qDebug() << "Write file";
}
if (p & QFileDevice::ExeOwner)
{
    qDebug() << "Exec file";
}

输出:

Read file
Write file

我尝试了 writeUser 等其他变体,但得到了相同的结果。

任何想法或建议。

我正在使用 Windows 10。

抱歉,我无法共享文件进行测试。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我不熟悉 Qt,但这可以通过 std::filesystem 完成:

    auto p = std::filesystem::status(file_name).permission();
    
    if(p & std::filesystem::perms::owner_read) { ... }
    if(p & std::filesystem::perms::owner_write) { ... }
    if(p & std::filesystem::perms::owner_exec) { ... }
    

    您还可以使用八进制值创建 filesystem::perms

    if(p & std::filesystem::perms{0400}) { ... }
    

    有关不同perms可用值的更多信息:https://en.cppreference.com/w/cpp/filesystem/perms

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2011-09-05
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多