【问题标题】:C - list all files in current directory then move in directory above, list files, and so on until root directory is reached [closed]C - 列出当前目录中的所有文件,然后移入上面的目录,列出文件,依此类推,直到到达根目录[关闭]
【发布时间】:2016-02-17 11:25:50
【问题描述】:

你能帮我开发一个用 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;
}

输出:

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

【问题讨论】:

标签: c linux


【解决方案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;
}

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

【讨论】:

  • 谢谢你,@Sam Watkins。这么多额外的选择。需要尝试它来记住和提高我的技能。再次感谢你。祝你有美好的一天。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您没有列出目录内容。为此,请使用:

    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
    

    【讨论】:

    • 感谢您的回答@mati865。但是我的代码列表文件在当前目录和父目录的更改。等等。它按我的预期工作,但我无法检查当前目录是否为根目录,并获得永恒循环((谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2012-12-09
    • 2012-10-28
    • 2012-09-02
    相关资源
    最近更新 更多