【问题标题】:fstat works, stat does notfstat 有效,stat 无效
【发布时间】:2018-03-21 18:37:46
【问题描述】:

我正在 Raspbian 上编译一个 Angband 变体,但以下失败:

struct stat txt_stat, raw_stat;

/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, template_file);

/* Access stats on text file */
if (stat(buf, &txt_stat))
{
  /* Error */
  msg_format("Oh dear, something went wrong with stat()! %s", strerror(errno));
  msg_format("Could not retrieve stats on the text file at {%s}", buf);
  return (-1);
}

最让我烦恼的是文件在 ~/git/hellband/lib/edit/r_info.txt

当我用打开文件的代码(使用相同的 buf)替换上面的代码,然后在文件描述符上使用 fstat() 时,它可以工作!!

我不想打开文件(记得关闭该文件),我只想知道/修复 stat() 的情况。

2020 年后记;结果是,当我使用 Angband 方法打开文件时,它会自动扩展 ~ 符号,这就是它起作用的原因,并且 fstat 起作用了。

【问题讨论】:

  • 你得到了什么错误/errno?
  • 文件或目录不存在。
  • 请注意选民,我的问题足以得到正确的(接受!)答案。
  • 没有细节,关于fstat 的短语非常令人困惑:打开文件的第一个想法 - 使用open - 会遇到与~ 相同的问题 stat 函数.请提供有关fstat 案例的更多详细信息(即使用my_fopen 打开文件)或完全删除此注释。并且最好将错误消息添加到 question post 本身。在目前的形式中,从问题帖子(没有 cmets!)中不清楚 stat 失败是因为它找不到文件。
  • @Tsyvarev 我认为你完全没有理解我的意思,对于像 P.P. 这样有经验的人来说。这个问题已经够好了。

标签: c linux file raspbian


【解决方案1】:

这很简单。 stat(2) 无法扩展或理解 ~(波浪号)。

您可以改为HOME。例如,getenv("HOME"),然后在调用 stat(2) 之前加上您的文件名前缀。

【讨论】:

  • OP 是否实际上将未扩展的路径传递给stat? OP提到通过将stat调用替换为open(或可能fopen加上fileno)和fstat来使代码工作,但这些也不会扩展或理解~(波浪号) !
  • Angband 使用my_fopen,也许它扩展了波浪号。
  • 谷歌搜索 Angband 显示“my_fopen”,它确实如此:angbandsource.wikia.com/wiki/Z-file.c 但我不知道这是否是你使用的。无论您使用什么“开放”,它都必须在扩展;否则,出于同样的原因,我预计会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2015-12-29
  • 1970-01-01
  • 2020-06-17
  • 2021-02-27
  • 2014-07-14
  • 2020-02-02
相关资源
最近更新 更多