【问题标题】:alternative to admin rights - fopen doesn't create C:\temp.txt in windows管理员权限的替代方法 - fopen 不在 Windows 中创建 C:\temp.txt
【发布时间】:2014-10-23 13:24:03
【问题描述】:

在我当前的项目中,我喜欢使用fopenfopen_s 通过“w”选项创建文件。

使用 QT GUI,用户可以选择任何文件名,该文件名基本上是文件对话框的返回字符串 - 类似于 Windows 对话框已知的内容。

QFileDialog::getSaveFileName(this,"Save as...","","all files (*.*)");

但是,取决于创建与否的文件名。

例如,我可以在构建目录“C:/SVN/builds/GUI/temp.txt”中写入文件
我可以在 Windows 桌面“C:/Users/XXX/Desktop/temp.txt”上创建文件
我什至可以在其他构建目录“C:/SVN/builds/foo/bin/Release/temp.txt”中创建文件
fopen 不允许我创建“C:/temp.txt”并返回“拒绝访问”(errorno 13)

我的问题可以像这里描述的那样解决:https://stackoverflow.com/a/4735652/2220850
但这实际上需要用户拥有管理员权限才能让我这个愚蠢的小工具正常运行。

那么是否还有其他方法可以获取写入用户从 GUI 中选择的文件的权限?
或者至少对于用户和我来说,有一种方法可以知道我们的工具可能会或可能不会在磁盘上创建文件的位置吗?

干杯

【问题讨论】:

  • 有一些 Shell API 可以找出把东西放在哪里。
  • “KNOWNFOLDERID”和“CSIDL”的 MSDN。

标签: c qt file-permissions fopen access-denied


【解决方案1】:

我认为您无法以干净的方式解决此问题。有些文件夹禁止非管理员用户使用。就是这样(无需调整操作系统设置)。

向您的用户显示一个合理的错误消息,例如“访问被拒绝(您可能需要管理员权限才能写入此目录,请选择您可能写入的目录)”可能是最好的方法。

【讨论】:

  • 有专门的 shell 调用来生成具有所需属性的文件夹的路径。
  • 这不能解决 C:/temp.txt 的问题,不是吗?这既不是跨平台也不是 Qt。无论如何,也许你的建议对 OP 有帮助。
【解决方案2】:

读/写外壳/操作系统告诉您可以/应该做的事情。调用 shell API 找出 Windows 操作系统的正确路径:

SHGetFolderPath()
SHGetKnownFolderPath()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2011-01-02
    • 2014-05-02
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多