【问题标题】:stat returns ENOENTstat 返回 ENOENT
【发布时间】:2012-09-18 21:27:19
【问题描述】:

我正在运行以下程序,它使用stat() 检查文件是否存在。但是,当我通过一条路径说$HOME/file.sh 时,它会因ENOENT 错误而失败。但是当我通过扩展路径时,即/root/file.shstat() 返回成功,即退出代码 0。

int main ()
{
    struct stat statbuf;
    char path [1024];
    strcpy(path,"$HOME/file.sh");

    int rc = stat(path,&statbuf);

    if (rc == -1 )
    {
        printf ("File not found !!\n");
    }
    else
        printf("Found it !!\n");

    return 0;
}

【问题讨论】:

  • $HOME 对 shell 脚本有意义,但对 C 程序没有意义。您要求 stat 在当前工作目录下方名为 $HOME 的目录中查找名为 file.sh 的文件。

标签: c linux stat


【解决方案1】:

strcpy() 不会将环境变量$HOME 扩展为其值,但会按照指定复制提取字符串文字。可以使用getenv()获取$HOME的值。

将您的失败消息更改为:

printf("File not found: %s\n", path);

用于确认。

【讨论】:

  • 是的,但这不是我关心的问题。我可以直接将 $HOME/file.sh 传递给 stat。但我的问题是我需要将绝对路径传递给 stat 吗?
  • @trax_code,不,你没有。如果路径不是绝对路径,则该路径被视为相对路径,它将相对于进程的当前目录。
  • 好的。一个问题。当前目录是指我运行可执行文件的目录?
  • @trax_code,是的。如果您想显示用于诊断目的,可以使用getcwd() 获取进程的当前目录。
  • stat() 也不会扩展 env/ var/ $HOME 。扩展由 shell 完成,stat() 不会使用 shell。 @trax_code
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2015-01-05
  • 2014-12-23
  • 2015-10-10
相关资源
最近更新 更多