【问题标题】:Unable to delete file with _wremove API (permission issue)无法使用 _wremove API 删除文件(权限问题)
【发布时间】:2022-01-13 15:11:59
【问题描述】:

我无法从我的 C++ 应用程序中删除临时文件,它因“权限被拒绝”错误而失败。这是代码sn-p,

void DeleteTempFile(const std::wstring& path) {
    wchar_t* wc = const_cast<wchar_t*>( path.c_str() );
    if( _wremove( wc ) != 0 )
        Log(fatal, std::string("Error: ") + std::strerror(errno) + std::string(" while deleting file: ") + std::string(path.begin(),path.end()));
    else
        Log(fatal, std::string("Successfully deleted file: ") + std::string(path.begin(),path.end()));
}

这是我在执行此代码时得到的日志,
错误:删除文件时权限被拒绝:C:/Windows/SERVIC~1/LOCALS~1/AppData/Local/Temp /abcD12E.pdf

有人可以帮我解决这个权限问题吗?

【问题讨论】:

  • 我什至没有权限查看该目录。您确定文件是首先创建的吗?
  • 如果您以提升的权限运行应用程序,它可以工作吗?
  • @BoP 是的,文件存在。我可以在管理模式下从 Cygwin 终端查看文件。
  • @Eljay 我正在从 Visual Studio 运行这个应用程序,它正在管理模式下运行。
  • 您不能删除已打开的文件,您将获得权限被拒绝。即使有提升的特权。 (在 Windows 上。其他操作系统可能有不同的限制和允许。)

标签: c++ file


【解决方案1】:

来自Microsoft docs

删除,_wremove

[...]

返回值

如果文件被成功删除,这些函数中的每一个都返回 0。否则,它返回 -1 并将 errno 设置为 EACCES 以指示路径指定只读文件、指定目录或文件已打开,或设置为 ENOENT 以指示文件名或找不到路径。

_wremove 的调用返回EACCES,因为Permission denied 已打印(检查errno constants)。所以有3个选择:

  1. 您的文件已打开(您需要先关闭文件,然后再调用_wremove)。
  2. 您的路径是目录名称。
  3. 该文件为只读文件(您需要更改文件权限)。

它不能是 2(我敢打赌 abcD12E.pdf 是一个文件)。检查是 1 还是 3 并执行括号中的操作。

【讨论】:

  • 补充一点:基于它是 pdf 文件的事实,选项 1 很可能;并且由于它位于临时目录中,因此选项 3 似乎很奇怪。
  • @HansOlsson 是的,确实如此。我觉得是1,很合理,就是希望OP能自己排除其他人。
猜你喜欢
  • 2023-03-25
  • 2019-08-19
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2012-02-01
  • 2015-05-15
  • 2014-12-26
相关资源
最近更新 更多