【问题标题】:std::ofstream does not show error when permission denied C++当权限被拒绝 C++ 时,std::ofstream 不显示错误
【发布时间】:2023-06-28 15:41:01
【问题描述】:

当 path = "c:\" 时,以下代码不会写入文件 c:\err.txt,因为权限被拒绝。但它不会同时产生错误。相反,它输出“OK”。

如何检查权限是否允许写入?

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

bool writeLineToErr(string path, string err_line){
  std::ofstream outfile(path+"err.txt", std::ios_base::app);

  if(!outfile){
      cout<<"Error 1 "+path+"err.txt"+" can't open file!";
      return false;
  }

  if(outfile.fail()){
       cout<<"Error 2 "+path+"err.txt"+" can't open file!";
      return false;
  }
  outfile << err_line << endl;

  cout<<"OK";
  outfile.close();
  return true;
}

int main(int argc, char** argv) {

    writeLineToErr("c:\\","Some Line");
    return 0;
}

【问题讨论】:

  • 感谢您提出问题。请包含一个 main() 函数并提供一个Compilable, Minimal, Complete, and Verifiable Example。这有助于我们为您提供帮助。
  • @john-murray 可编译、最小、完整且可验证的示例 - 完成!
  • “我如何检查权限是否允许写入” - stat()access() 有两种方法.. 但它仍然可能失败 (TOCTOU)。
  • @FrançoisAndrieux Per this failbit 如果无法打开文件,则设置。

标签: c++ file ofstream


【解决方案1】:

我会说你的代码有效并且写入操作实际上已经完成,但是为了它,在写入之后也添加一个检查:

outfile << err_line << endl;
if(outfile.fail()) cout << "Error3\n";
else cout<<"OK";

在我的系统上,如果文件没有打开写入成功,我会得到你的Error 1 ... can't open file

编辑: 或者您正在运行 Windows 且 Compatibility Files 虚拟化仍处于活动状态?如果是这样,该文件可能会在 Virtual Store 中,而不是在真正的 C:\err.txt 路径中。

示例:C:\Users\username\AppData\Local\VirtualStore

如果你在那里找到它,你可能还会在那里找到很多其他东西。至少我在几年前遇到类似问题时做过。我决定手动移动(使用管理员权限)我的一些旧程序放在那里的几个重要文件,然后关闭虚拟商店。我现在找不到关于如何关闭文件和注册表虚拟化的良好且简单的官方 Microsoft 链接,所以也许可以这样做:

注册编辑: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ 创建一个名为EnableVirtualizationDWORD 键,并为其赋予值0。如果密钥已经存在,但设置为非零值,请更改它。

这里还有更多: UAC Group Policy Settings and Registry Key Settings

【讨论】:

  • 我根本不知道这是一件事。谢谢!
  • @AndrewE 欢迎您!在我自己发现之前,这个“功能”让我愚弄了很长一段时间。 :-)