stat()不能在父目录上工作

时间:2015-11-25 09:13:58

标签: c directory parent stat

我尝试在C中编写ls命令,但stat()拒绝打开任何其他目录。

 ~/Desktop/ls$ cat bug.c 
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <unistd.h>

int     main(int ac, char **av)
{
  DIR       *d;
  struct dirent *dir;
  struct stat   file;

  d = opendir(av[1]);
  if (d)
    {
      while ((dir = readdir(d)) != NULL)
        {
          printf("%s ->", dir->d_name);
          if (lstat(dir->d_name, &file) < 0)
          printf(" can't read file %s!", dir->d_name);
          printf("\n");
        }
    }
  closedir(d);
  return (0);
}

运行./a.out时。或任何子文件夹,它可以正常工作。 但如果我写./a.out ..,它就无法打开文件......

~/Desktop/ls$ ./a.out ..
.. ->
fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf -> can't read file fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf!
ss -> can't read file ss!
ls -> can't read file ls!
. ->
tg -> can't read file tg!

./a.out /home/login/Desktop也不起作用,但./a.out /home/login/Desktop/ls/正确显示当前文件夹的内容。

看起来a.out无法打开父母目录,但ls -l给出了:

-rwxrwxr-x 1 hellomynameis hellomynameis 13360 nov.  25 09:56 a.out

我做错了吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您的lstat电话错误。当您从打开的目录中获取名称时,它是相对名称,因此您需要将其转换为正确的路径以让lstat找到该文件:

char path[...];
sprintf(path,"%s/%s",av[1],dir->d_name);
lstat(path,...);

答案 1 :(得分:1)

程序a.out可能无权读取该文件夹中的所有文件。尝试使用root权限运行a.out。

并且,如果您想检查错误,请打印错误以获取错误的详细信息 lstat 执行成功。