【问题标题】:lstat returns -1lstat 返回 -1
【发布时间】:2010-12-19 15:20:00
【问题描述】:

我使用lstat 获取文件的特征,但它似乎不起作用,它返回-1 和错误-没有这样的文件或目录-。

我在 shell 中尝试路径,输入:

:~$ ls /home/mypc/Desktop/file.c
/home/mypc/Desktop/file.c

所以这条路径显然适用于ls,但不适用于lstat!这很奇怪。 这是我打电话给lstat的那一行:

int i=lstat(path, &buff );

pathchar[]buffstruct stat 对象。

如果您有任何想法,请...

【问题讨论】:

  • 您的path 可能是错误的。让我们看看你是如何设置它的。
  • printf("%s\n",path) ; 在统计之前查看path 的设置。
  • 您还可以使用stracektracektrusstruss(以您的平台上可用的为准)查看究竟发生了什么。
  • 我是用 f​​gets 做的,没错。问题是我不知道一个完美的方法来把我从 fgets 得到的路径放在一个 char foo[] 中,然后放在 lstat 中。即使使用 getcwd 我也尝试过,但它不起作用。有人可以用 getcwd 写一个例子,路径由 fgets 和 lstat 给出吗?谢谢

标签: c stat


【解决方案1】:

这是正确的行为。你的路径不存在。

来自文档:

返回值 成功完成后,返回值 0。否则,一个值 的 -1 返回并设置 errno 以指示错误。

正如@Noufal 所说,您可以尝试打印路径。可能是您的路径附加了\n;如果您使用fgets 阅读它,这很可能。

【讨论】:

  • 我是用 f​​gets 做的,没错。问题是我不知道一个完美的方法来把我从 fgets 得到的路径放在 char foo[] 中,然后放在 lstat 中。我试着用 getcwd 来做,但它不起作用。有人可以用 getcwd 写一个例子,路径由 fgets 和 lstat 给出吗?谢谢
【解决方案2】:

来自 fgets 手册页:If a newline is read, it is stored into the buffer.

所以你正在尝试 lstat /path/yourfile.c\n。显然你的文件名是yourfile.c 而不是yourfile.c\n

添加了更多解释

您的“路径文件”类似于/path/to/yourfile.c\n/other/path/to/otherfile.txt\n。文件“使用”\n(新行)字符来分隔文件中的不同条目。

当您使用fgets 读取它时,每次都会填充path 变量,并从“路径文件”读取整行,包括结尾的\n 字符。因此,如果您查看程序内存内部,您会发现 path 看起来像 /path/to/yourfile.c\n\0somegarbage(在第一次调用 fgets 之后)。

现在,您必须去掉尾随的 \n,就在标识字符串结尾的 \0 之前。
正如您在其中一个 cmets 中所写,您可以使用 memset 来执行此操作,但恕我直言,还有更简单的方法。

【讨论】:

  • 那么如何删除 \0 ?以 memset 为例? : memset(&path[last_element], 0, sizeof(char));是这样吗?
  • 不,不要删除'\0'。您必须删除 '\0' 之前的 '\n'。好的,我会编辑答案
  • 在 \0 之前有一个 \n ???我第一次听到这个。那么,如果我有一个字符串,我必须对它做些什么才能在 lstat 中传递它?如果可以的话,请举个例子。谢谢!
  • 谢谢!谢谢!谢谢!谢谢!我做到了。太简单了。谢谢;)
【解决方案3】:

来自fgets的手册页:

fgets() 从流中最多读入一个小于 size 的字符,并且 将它们存储到 s 指向的缓冲区中。阅读停止后 EOF 或换行符。如果读取了换行符,则将其存储到缓冲区中。 终止空字节('\0')存储在最后一个字符之后 缓冲区[...]。

这就是你的情况。

path\n\0 ^^^^ ^ ^ 1234 5 6

记住这一点!希望对您有所帮助。

【讨论】:

    【解决方案4】:

    首先,查看错误值。该路径可能存在,但可以通过其他方式到达。

    【讨论】:

      【解决方案5】:

      感谢您的回答。 我使用 fgets 从给我路径的管道中读取一行是正确的。 问题不在于文件肯定无法访问,因为我检查了这一点。 问题出在路径本身。我愿意:

      while ( (fgets ( path, 512, f ) )) {//path name is f.e.: ./.local/share/Trash/files/myFile.c
             struct stat buff;
             //here I have the path and I give it in lstat
             if(lstat(&path[1], &buff )==0){ //I give path[1] and not path[0] to avoid the dot in the begining
             }
      }
      

      错误必须是路径名。

      【讨论】:

      • 您不会创建答案来添加新的详细信息。相反,您可以编辑问题。在任何情况下,请使用markdown syntax 格式化代码。
      猜你喜欢
      • 2016-10-28
      • 1970-01-01
      • 2018-08-10
      • 2015-03-04
      • 2013-10-27
      • 2016-07-28
      • 2014-09-26
      • 2012-04-04
      • 2010-09-30
      相关资源
      最近更新 更多