0

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对象。

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

4

5 回答 5

4

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

从文档中:

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

正如@Noufal 所说,您可以尝试打印路径。可能是您的路径\n附加了一个;如果您使用fgets.

于 2010-12-19T15:47:11.233 回答
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(换行)字符来分隔文件中的不同条目。

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

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

于 2010-12-19T21:08:16.887 回答
1

从手册页fgets

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

所以这是你的情况。

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

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

于 2016-07-08T11:08:33.063 回答
0

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

于 2010-12-19T15:50:25.963 回答
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
       }
}

错误必须是路径名。

于 2010-12-19T16:50:36.573 回答