我使用lstat
来获取文件的特征,但它似乎不起作用,它返回-1并且错误 - 不是这样的文件或目录 - 。
我在shell中尝试路径,输入:
:~$ ls /home/mypc/Desktop/file.c
/home/mypc/Desktop/file.c
因此,此路径显然适用于ls
,但不适用于lstat
!这很奇怪。
这就是我调用lstat
的行:
int i=lstat(path, &buff );
path
是char[]
,buff
是struct stat
对象。
请您有任何想法......
答案 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
}
}
错误必须是路径名。