lstat返回-1

时间:2010-12-19 15:20:00

标签: c stat

我使用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对象。

请您有任何想法......

5 个答案:

答案 0 :(得分:3)

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

来自文档:

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

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

答案 1 :(得分:1)

从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
正如您在其中一条评论中所写,您可以使用memset来执行此操作,但是,恕我直言,有更简单的方法。

答案 2 :(得分:1)

来自fgets的手册页:

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

所以这是你的情况。

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

重新启动!希望它有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

感谢您的回答。 我使用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
       }
}

错误必须是路径名。