C - 列出当前目录中的所有文件,然后在上面的目录中移动,列出文件等,直到到达根目录

时间:2016-02-17 11:25:51

标签: c linux

你能帮助我在C中开发一个扫描当前目录的程序吗? 显示位于那里的所有文件的名称 有扩展名。然后程序进入 父目录,然后成为当前,这些 重复上述步骤,直到当前目录不是 成为根目录。 谢谢。 祝你有愉快的一天。

P.S。抱歉。这是我正在努力工作的代码。它列出了当前目录中的所有文件,但没有转到父目录。 P.S.S我的代码列出当前目录中的文件,也改为父目录。等等。它按预期工作,但我无法检查当前目录是否为root,并获得永久循环。感谢。

#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;
}

输出:

Current working dir: /
Current working dir: /
......................
Current working dir: /

3 个答案:

答案 0 :(得分:1)

这是解决方案,可能不优雅,但工作 - 检查是否

(int)cwd[1] != 0

cwd 数组的第二个元素的int值为 0 。这意味着该目录是&#34; /&#34; - 父母和停止。

#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;
}

答案 1 :(得分:1)

您的cwd[1] != 0cwd[1] != '\0'是可行的方法。没有必要将其强制转换为int。

您还可以使用strcmp(cwd, "/"),这会让您更清楚自己在做什么。在UNIX或Linux系统的根目录下,它将为零。

对于更便携的解决方案,您可以将当前目录名称与之前的目录名称进行比较,如下所示:

char cwd[1024];
char parent[1024];
getcwd(cwd, sizeof(cwd));

并在循环内部:

        chdir("..");
        getcwd(parent, sizeof(parent));
        if (strcmp(cwd, parent) == 0)
                break;
        strcpy(cwd, parent);

在POSIX系统上,您可以使用以下代码检查当前目录是否为根而不使用getcwd()

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;
}

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

答案 2 :(得分: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