C 列出当前目录中的所有文件,然后移到上面的目录中,列出文件,依此类推,直到到达根目录

C 列出当前目录中的所有文件,然后移到上面的目录中,列出文件,依此类推,直到到达根目录,c,linux,C,Linux,你能帮我用C语言开发一个扫描当前目录和 显示位于其中的所有文件的名称 带扩展名。然后程序转到 然后变为当前的父目录,以及 重复上述步骤,直到当前目录不存在为止 成为根目录。 谢谢 祝你今天愉快 另外,对不起。这是我正在努力实现的代码。它列出当前目录中的所有文件,但不转到父目录。 P.S.S我的代码列出当前目录中的文件以及对父目录的更改。等等它的工作原理和我预期的一样,但我无法检查当前目录是否为根目录,并获取永恒循环。谢谢 #include <unistd.h> #include &l

你能帮我用C语言开发一个扫描当前目录和 显示位于其中的所有文件的名称 带扩展名。然后程序转到 然后变为当前的父目录,以及 重复上述步骤,直到当前目录不存在为止 成为根目录。 谢谢 祝你今天愉快

另外,对不起。这是我正在努力实现的代码。它列出当前目录中的所有文件,但不转到父目录。 P.S.S我的代码列出当前目录中的文件以及对父目录的更改。等等它的工作原理和我预期的一样,但我无法检查当前目录是否为根目录,并获取永恒循环。谢谢

#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>

int main(void)
{
  DIR *d;
  char cwd[1024];
  struct dirent *dir;
  do {
      d = opendir(".");
       if (getcwd(cwd, sizeof(cwd)) != NULL)
           fprintf(stdout, "Current working dir: %s\n", cwd);
       else
           perror("getcwd() error");
      if (d)
      {
        while ((dir = readdir(d)) != NULL)
        {
          if (dir->d_type == DT_REG)
          {
            printf("%s\n", dir->d_name);
          }
        }
        chdir("..");
        closedir(d);
      }
  // Do not know how to check if current directory is root
  // and getting eternal loop 
  }while (cwd != "/");
  return 0;
}

您没有列出目录内容。要做到这一点,请使用:

system("ls");      //show files in current directory that doesn't begin with "."
system("ls -a");   //show all files in current directory
列出当前和父项的简单代码

system("ls");
chdir("./..");
system("ls");
这就是输出

$ Debug/lf.o
list_files.c                   //current directory
Debug  src  test_file.txt      //parent directory

这是一个解决方案,也许不优雅,但工作-检查如果

(int)cwd[1] != 0
cwd数组的第二个元素的int值为0。这意味着目录为“/”-父目录并停止

#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>

int main(void)
{
  DIR *d;
  char cwd[1024];
  struct dirent *dir;
  do {
      d = opendir(".");
       if (getcwd(cwd, sizeof(cwd)) != NULL)
           fprintf(stdout, "Current working dir: %s\n", cwd);
       else
           perror("getcwd() error");
      if (d)
      {
        while ((dir = readdir(d)) != NULL)
        {
          if (dir->d_type == DT_REG)
          {
            printf("%s\n", dir->d_name);
          }
        }
        chdir("..");
        closedir(d);
      }
  }while ((int)cwd[1] != 0);
  return 0;
}
#包括
#包括
#包括
#包括
内部主(空)
{
DIR*d;
char-cwd[1024];
结构方向*dir;
做{
d=opendir(“.”);
if(getcwd(cwd,sizeof(cwd))!=NULL)
fprintf(标准输出,“当前工作目录:%s\n”,cwd);
其他的
perror(“getcwd()错误”);
如果(d)
{
而((dir=readdir(d))!=NULL)
{
if(dir->d_type==DT_REG)
{
printf(“%s\n”,dir->d_name);
}
}
chdir(“…”);
closedir(d);
}
}而((int)cwd[1]!=0);
返回0;
}

您的
cwd[1]!=0
cwd[1]!='\0'
是一个不错的方法。没有必要将其转换为int

您还可以使用strcmp(cwd,“/”,这使您的操作更加清晰。在UNIX或Linux系统的根目录中,该值将为零

要获得更方便的解决方案,可以将当前目录名与以前的目录名进行比较,如下所示:

char cwd[1024];
char parent[1024];
getcwd(cwd, sizeof(cwd));
int cwd_is_root(void)
{
        struct stat cwd, parent;
        if (stat(".", &cwd) < 0)
                return -1;
        if (stat("..", &parent) < 0)
                return -1;
        return cwd.st_ino == parent.st_ino && cwd.st_dev == parent.st_dev;
}
在循环内部:

        chdir("..");
        getcwd(parent, sizeof(parent));
        if (strcmp(cwd, parent) == 0)
                break;
        strcpy(cwd, parent);
在POSIX系统上,您可以检查当前目录是否为根目录,而无需使用
getcwd()
,代码如下:

char cwd[1024];
char parent[1024];
getcwd(cwd, sizeof(cwd));
int cwd_is_root(void)
{
        struct stat cwd, parent;
        if (stat(".", &cwd) < 0)
                return -1;
        if (stat("..", &parent) < 0)
                return -1;
        return cwd.st_ino == parent.st_ino && cwd.st_dev == parent.st_dev;
}
int cwd_是_根(void)
{
结构统计cwd,父级;
如果(状态(“.”,&cwd)<0)
返回-1;
if(stat(“..”,&parent)<0)
返回-1;
返回cwd.st_ino==parent.st_ino&&cwd.st_dev==parent.st_dev;
}

除非您正在编写自己的libc,否则只使用
getcwd
会更简单、更好
getcwd
是Linux上的一个系统调用。

请花一些时间重新阅读,特别是名为和的部分。特别是重读。以及如何像家庭作业一样创建一个。sounds,你有没有尝试过?发布您当前的代码,并解释您的困境。您好,@liam\u g。谢谢你的回答。我已经添加了我正在努力工作的代码。谢谢。闻起来像是家庭作业。是的,@Ashish Ahuja。这是作业,我受够了。谢谢你的回答@mati865。但我的代码列出了当前目录中的文件,并更改为父目录。等等它的工作原理和我预期的一样,但我无法检查当前目录是否为根目录,也无法获取永恒循环((谢谢。谢谢你,@Sam Watkins。有太多额外的选项。需要尝试一下它来记住和提高我的技能。再次感谢你。祝你愉快。