【问题标题】:stat() doesn't work on parent directorystat() 不适用于父目录
【发布时间】:2016-02-28 00:07:46
【问题描述】:

我正在尝试用 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

我做错了吗?

谢谢!

【问题讨论】:

  • 我在“ls”输出中看不到“fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf”。 stat() 无法报告它找不到的文件。您的意思是在 '../fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf' 上运行 stat 吗?
  • 关于stat(), 1) 必须传递完整(可以是相对或绝对)路径,即使当前目录也应引用为./ 2) 目录/文件必须具有当前正在执行的程序读取目录/文件的适当权限。这包括“路径”参数中的任何/所有目录
  • 贴出的代码编译不干净!编译时始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic
  • 访问 argv[0] 以外的任何 argv[] 条目时,始终检查 argc 的值以确保命令行参数确实存在。否则,如果使用实际上没有输入必要的命令行参数,则可能会访问 NULL 指针或内存中的某个随机值
  • 发布的代码(可能)不想尝试打开目录条目...,因此应检查目录名称以确保它不是这些值。 (一定要使用类似 strcmp() 的东西,这样就不会跳过以 . 开头的文件或目录名称

标签: c directory parent stat


【解决方案1】:

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

并且,如果您想检查错误,请打印 errno 以在 lstat 函数没有的情况下获取 error 的详细信息执行成功。

【讨论】:

    【解决方案2】:

    您的lstat 呼叫错误。当你从打开的目录中得到一个名字时,它是一个相对名字,所以你需要把它转换成正确的路径,让lstat定位到文件:

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

    【讨论】:

    • 可能需要一个'/'分隔符?
    • 当然!你需要构造类似../filename
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多