【问题标题】:fopen is unable to open windows hosts filefopen 无法打开 windows 主机文件
【发布时间】:2018-12-30 20:30:12
【问题描述】:

我在这里有一个FILE* target,它应该打开 Windows 主机文件并写入它:

FILE* target;
target = fopen("C:\\windows\\sysnative\\drivers\\etc\\hosts", "r+");
if (target != NULL) {
    printf("true\n");
} else {
    printf("false\n");
}

但是,在打开 windows 主机文件时,它无法打开它。具体来说,fopen() 返回NULL 并且false 被打印到屏幕上。我检查了目录。这很好。删除多余的\s,我可以用记事本打开它。但是fopen() 无法打开该文件。它可以打开当前工作目录或其中的嵌套目录中的任何文件,但无法打开主机文件。也许我的路径有问题?我错过了什么吗?

【问题讨论】:

  • 你确定打开模式"r+"?这意味着您要打开阅读和写作。而且你不能打开写作也不是不可能的。
  • @Someprogrammerdude 如果我打开它是为了读写,那么这意味着我也可以write到它吗?
  • 这是一个系统文件,需要管理员权限才能写入
  • @Jean-FrançoisFabre 你建议我如何解决它?我应该以管理员身份使用gcc 编译源代码,还是以管理员身份运行可执行文件本身?我已经尝试以管理员身份运行可执行文件,但仍然无法解决问题。
  • 先用r模式试试看能不能看懂。然后尝试写入它,在运行 exe 时使用提升的权限

标签: c windows network-programming fopen


【解决方案1】:

您需要管理员权限才能在 Windows 上打开主机文件,请尝试以管理员身份运行您的脚本。

【讨论】:

  • 显然以管理员身份运行 Windows 命令提示符,然后编译源代码,并从其中运行可执行文件,工作正常! fopen() 能够成功写入文件。
  • 具体来说,hosts 文件授予标准用户通用读取权限,因此"r" 模式可以正常工作,但“r+”模式需要管理员身份。
【解决方案2】:

每当 Windows 上的文件操作失败时,您都可以调用 GetLastError()(Posix 系统上的 errno`)来找出操作失败的原因。这将返回一个错误代码,您可以查找它以找出失败的原因

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多