你能帮助我在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: /
答案 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] != 0
或cwd[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